我有一个输入字符串,它是一个目录地址:
示例:ProgramFiles/Micro/Telephone
我想非常严格地将它与单词列表匹配:
示例:Tel|Tele|Telephone
我希望与Telephone
匹配,而不是Tel
。现在我的正则表达式看起来像这样:
my( $output ) = ( $input =~ m/($list)/o );
上面的正则表达式将匹配Tel
。我该怎么做才能解决它?
答案 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} *)
这有意义吗?