仅当字符串中存在选定的单词时,RegEx才匹配

时间:2013-02-18 10:44:09

标签: regex perl

我是regEx的新手,我无法找到解决方案。如果该字符串中存在两个选定单词中的任何一个,我想匹配一个字符串。

我这样写了

perl -e ' "text   -aborted" =~ m/(.*)-[failed aborted]/; print "\n\n$1\n\n";'

但问题是,即使字符串中存在失败或中止的任何字符,它也会匹配, 例如

 perl -e ' "text   -fa" =~ m/(.*)-[failed aborted]/; print "\n\n$1\n\n";'

我想只匹配失败或中止的完全匹配,有人请帮忙解决这个问题吗?

4 个答案:

答案 0 :(得分:4)

正则表达式中的方括号[]的行为与您期望的不同。它们匹配单个字符,该字符可以是方括号内的任何字符。例如,如果您想匹配单个小写元音,则可以使用:

m/[aeiou]/

您正在寻找的是交替。这将搜索“失败”或“中止”一词:

m/(failed|aborted)/

也就是说,您的选择每个都由管道|分隔,并用括号()括起来。你也可以将它们连在一起:

m/(many|different|acceptable|words)/

答案 1 :(得分:3)

尝试交替,就像这样

m/(.*)-(?:failed|aborted)/

(?:...)序列以与括号相同的方式对项目进行分组,但不会形成捕获。

此外,您可以使用

避免捕获尾随空格
m/(.*?)\s*-(?:failed|aborted)/

使用非贪婪量词(附加?)来允许模式匹配为少数字符。

答案 2 :(得分:1)

[...]引入了一个字符类。列出的任何字符都匹配该类。您需要交替

"text -aborted" =~ /(.*)-(?:failed|aborted)/

答案 3 :(得分:1)

方括号表示character class,i。即(正如您所注意到的)正则表达式与括号内的一个字符匹配。

您想要简单的alternation|)以及非捕获括号((?:...)):

perl -e ' "text   -aborted" =~ m/(.*)-(?:failed|aborted)/; print "\n\n$1\n\n";'