匹配字符串但不包含另一个字符串

时间:2013-10-04 15:03:37

标签: regex perl

我正在寻找匹配[ERROR]而不是[ERROR].*Internal Error的正则表达式。我不是很擅长正则表达式。但我试过这个并没有用: -

\[ERROR\].*(?!.*[Ii]nternal [Ee]rror).

有什么建议吗?

3 个答案:

答案 0 :(得分:5)

[ERROR] Internal Error,您的模式匹配如下:

    +------------------------ pos  0, len  7  "[ERROR]"
    |    +------------------- pos  7, len 15  " Internal Error"
    |    |             +----- pos 22, len  0  ""
    |    |             |
 ___|___ |  ___________|____________
/       \/\/                        \
\[ERROR\].*(?!.*[Ii]nternal [Ee]rror)

您需要确保Internal Error之后的任何位置都无法[ERROR]开始。

/\[ERROR\](?:(?![Ii]nternal [Ee]rror).)*\z/s

(?:(?!STRING).)*STRING[^CHAR]*CHAR


也就是说,\z允许您将上述内容简化为以下内容:

/\[ERROR\](?!.*[Ii]nternal [Ee]rror)/s

答案 1 :(得分:2)

为了清晰/简单,使用两个正则表达式(!〜表示“不匹配”)

if ( ($a =~ /\[ERROR\]/) && ($a !~ /[Ii]nternal [Ee]rror/)) {
    #do your stuff
}

答案 2 :(得分:-1)

(\[ERROR\])(?:.(?![Ii]nternal [Ee]rror))+.