我是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";'
我想只匹配失败或中止的完全匹配,有人请帮忙解决这个问题吗?
答案 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";'