在Delphi中使用通配符搜索字符串中的模式?

问题描述:

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

我的旧代码(返回TRUE):

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

我看到德尔福XE拥有TRegEx但我还是老样子不明白使用它。

这些代码不会返回TRUE:

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

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

谢谢。

+2

想想你用匹配单个字符。 – MGH 2011-05-13 09:14:19

+0

真的吗? MatchesMask *应该*已经工作。你确定你的测试是有效的吗? – 2011-05-13 14:10:53

+0

@Rob,我的意思是MatchesMask在我的真实案例中不起作用。通过使用点,我的问题已解决。对不起,迟交回复,因为我不得不修复一些代码,所以我可以尝试从MGH的答案。 – user 2011-05-17 11:59:51

if?代表单个字符:

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

if?代表任何刺:

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

没有XE所以没有测试过。

+1

小心点...;)http://www.regular-expressions.info/dot.html,例如它会匹配abcdef,但它也会匹配abcd,f abcd/f,abcd(f等)。正则表达式可以使用更强大的语法来获得您需要匹配的内容。 – 2011-05-13 09:32:36

+0

@MGH,它适用于我的示例,但不适用于我的真实代码。等待.. – user 2011-05-13 09:37:36

+0

@user'。'不匹配如果你有换行符我想,那么你需要使用'[。\ n \ r]'来代替'。' – MGH 2011-05-13 09:46:56

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

+1

对于您单独提供的链接+1。我还建议,如果您打算花费任何时间处理正则表达式,您可以投资一份[RegExBuddy](http://regexbuddy.com)。这是创建和测试正则表达式的宝贵工具。 (不以任何方式附属 - 多年来只是一个非常高兴的客户。) – 2011-05-13 11:29:14

可以使用TMask为wildchar匹配: ''

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

isMatch =真 (C++ Builder代码是帕斯卡只是translable)