正则表达式最长可能匹配

时间:2010-03-30 22:44:21

标签: regex

我有一个输入字符串,它是一个目录地址:

示例:ProgramFiles/Micro/Telephone

我想非常严格地将它与单词列表匹配:

示例:Tel|Tele|Telephone

我希望与Telephone匹配,而不是Tel。现在我的正则表达式看起来像这样:

my( $output ) = ( $input =~ m/($list)/o );

上面的正则表达式将匹配Tel。我该怎么做才能解决它?

3 个答案:

答案 0 :(得分:9)

如果你想要一个完整的单词匹配:

\b(Tel|Tele|Telephone)\b

\b是零宽度字边界。在这种情况下,字边界表示从单词字符过渡到单词字符。单词字符(\w)为[0-9a-zA-Z_]

如果您只想匹配部分单词匹配中最长的匹配,请将最长的匹配。例如:

\b(Telephone|Tele|Tel)

(Telephone|Tele|Tel)

答案 1 :(得分:2)

将订单:Tel|Tele|Telephone更改为Telephone|Tele|Tel。 通过正则表达式算法,从左到右搜索交替,如果找到匹配,那就是它,没有贪婪的匹配。 例如:/ a | ab | abc /工作“abc”匹配“a”而不是最贪婪的“abc”。

或使用匹配的表达式。

Tel(?:e(?:phone)?)?

答案 2 :(得分:-1)

如果最长匹配不在输入中的任何位置,尝试查找匹配怎么样? 类似的东西:

查找电话,或查找电话和电话,其中电话不在输入的任何地方。所以,开始让它看起来像一个正则表达式:

(电话)或 没有电话的字符,然后是(tel | tele),后跟没有电话的字符

(电话| *。(电话){0} *(电话|。。。远摄)*(电话){0} *)

这有意义吗?