【问题标题】:Search pattern in string using wildcard in Delphi?在Delphi中使用通配符在字符串中搜索模式?
【发布时间】:2011-08-24 18:32:26
【问题描述】:

我曾经使用 HYPERSTR 库进行字符串处理例程。现在我使用较新的德尔福。我需要在字符串中搜索模式,例如旧函数是function IsMatchEx(const Source, Search:AnsiString; var Start:integer) : Integer;。其实我不需要结果值,我只想知道模式是否与字符串匹配。

我的旧代码(返回 TRUE):

var
  StartPos: integer;
  FoundPos: integer;
begin
  StartPos := 1;
  FoundPos := IsMatchEx('abcdef', 'abcd?f', StartPos);
  if FoundPos > 0 then
    showmessage('match');
end;

我看到 Delphi XE 有 TRegEx,但我还是不明白如何使用它。

这些代码不返回 TRUE:

  if TRegEx.IsMatch('abcdef', 'abcd?f') then
    showmessage('match');

我在使用MatchesMask时也得到了同样的结果。

谢谢。

【问题讨论】:

  • 认为你使用'.'匹配单个字符。
  • 真的吗? MatchesMask 应该起作用了。您确定您的测试有效吗?
  • @Rob,我的意思是 MatchesMask 在我的真实案例中不起作用。通过使用点,我的问题已经解决。抱歉回复晚了,因为我必须修复一些代码,以便我可以尝试 MGH 的答案。

标签: delphi pattern-matching delphi-xe


【解决方案1】:

正则表达式语法不同。 ?和 * 有不同的含义。请参阅http://www.regular-expressions.info/tutorial.html 了解正则表达式的精彩介绍。 您可以使用类似 abcd[a-z]f 或 abcd\wf,甚至其他语法,具体取决于您想要匹配的内容。

【讨论】:

  • +1 表示您单独提供的链接。我还建议,如果您打算花时间使用正则表达式,请购买一份RegExBuddy 的副本。它是创建和测试正则表达式的宝贵工具。 (不以任何方式附属 - 多年来只是一个非常高兴的客户。)
【解决方案2】:

如果?表示单个字符:

  if TRegEx.IsMatch('abcdef', 'abcd.f') then
    showmessage('match');

如果?代表任何刺痛:

  if TRegEx.IsMatch('abcdef', 'abcd.*f') then
    showmessage('match');

没有 XE,所以没有测试。

【讨论】:

  • 当心点... ;) regular-expressions.info/dot.html,例如它会匹配 abcdef,但它也会匹配 abcd,f abcd/f, abcd(f, 等等。Regex 可以使用更强大的语法可以准确获取您需要匹配的内容。
  • @user '.'如果你有换行符我认为不匹配,那么你需要使用 '[.\n\r]' 代替 '.'
  • 嗯..我认为不会有新行。输入是来自文件的十六进制字符串。不知何故,我认为我的strtohex 的结果无效,所以我必须先修复它,该回家了! :)
  • 使用十六进制输入,您很可能希望使用 ldsandon 的建议来匹配您真正想要的。 [0-9a-fA-F]* 应该匹配十六进制。
  • 第一个例子的掩码不应该是'abcd.?'而不是“abcd.f”?
【解决方案3】:

您可以使用 TMask 进行通配符匹配:

TMask *m = new TMask("String to check");
bool isMatch = m->Matches("string to*");
delete m;

isMatch = 真 (C++Builder 代码可以简单地用 Pascal 翻译)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多