0

我是 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

4 回答 4

4

正则表达式中的方括号[]的行为与您在这里所期望的不同。它们匹配单个字符,并且该字符可以是方括号内的任何字符。例如,如果你想匹配一个小写元音,你可以这样做:

m/[aeiou]/

What you're looking for is an alternation. This will search for the word "failed" or "aborted":

m/(failed|aborted)/

That is, your choices are each separated by pipes |, and surrounded with parentheses (). You can chain these together too:

m/(many|different|acceptable|words)/
于 2013-02-18T10:51:59.610 回答
3

一个试试,像这样

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

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

此外,您可以避免使用捕获尾随空格

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

它使用非贪婪量词(带有附加的?)来允许模式匹配尽可能少的字符。

于 2013-02-18T10:51:29.087 回答
1

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

"text -aborted" =~ /(.*)-(?:failed|aborted)/
于 2013-02-18T10:51:21.987 回答
1

方括号表示一个字符类,即(正如您正确注意到的)一个与括号内的字符之一匹配的正则表达式标记。

您需要简单的替换( |) 以及非捕获括号 ( (?:...)):

perl -e ' "text   -aborted" =~ m/(.*)-(?:failed|aborted)/; print "\n\n$1\n\n";'
于 2013-02-18T10:51:29.360 回答