如何使用正则表达式匹配“不遵循一些文字”?

时间:2013-08-22 12:55:48

标签: regex

我希望匹配文字形式的所有文字( - 即:文字后跟空格,然后打开括号。但如果文字属于“嗨“或”你好“或”再见“,那就不应该匹配了。

所以我正在寻找以下结果

Literal     ::      Result
--------------------------------    
Hello (     ::      Match
There (     ::      Match
hello (     ::      Not Match
New (       ::      Match
hi (        ::      Not Match

我试图通过前瞻性正则表达式来做到这一点。所以我就像

一样
(^|\s)(?!((hello|hi|bye)(\s\()))

但它匹配所有。

我不能通过lookbehind来做,因为它不采用正则表达式。

有没有正则表达式来执行此任务?

更新

我正在尝试 perl checkstyle (不知道checkstyle使用哪种风格)

lookahead 为两者提供匹配 但是在 lookbehind 中,Perl会给出错误Variable length lookbehind not implemented in regex m/(?<!(hello|hi|bye))\s\(/,而在checkstyle中我得到了理想的结果。

3 个答案:

答案 0 :(得分:2)

您的正则表达式不起作用,因为它始终与文字和(之间的空格匹配(因为空格匹配(^|\s)(不匹配((hello|hi|bye)(\s\()))。它还应该匹配许多其他地方的空间。

Test to show what yours matches

这个正则表达式应该有效:

\b(?!(?:hello|hi|bye)\s)\w+\s\(

Test for this regex

<强>解释

\b - 字边界。
(?!(?:hello|hi|bye)\s) - 对hellohibye进行负面预测,后跟空格。
它后跟一个空格,所以我们匹配byelo (,如果不需要,请删除它 (?:hello|hi|bye)而不仅仅是(hello|hi|bye)只是使其成为非捕获组,它不会改变输出。
\w+ - 一个或多个单词字符(单词字符通常为[A-Za-z0-9_]\s - 空格 \( - 括号。

答案 1 :(得分:1)

如果您使用的是与Perl兼容的regex引擎,那么您应该可以使用像这样的零宽度负向外观断言......

(?<!hello|hi|bye) \(

使用R(打开perl-compatability)的示例......

string <- c( "hello (" , "hi (" , "bye (" , "Hello (" , "Anything (" )
grepl( pattern = "(?<!hello|hi|bye) \\(" , string , perl = TRUE )
[1] FALSE FALSE FALSE  TRUE  TRUE

我们可以更精确一点......

^.+(?<!^hello|^hi|^bye)\s\(

匹配字符串的开头,然后可选地匹配任何字符,但不能在字符串的开头匹配hellohibye,然后是空格,然后是打开的括号。

答案 2 :(得分:0)

我的猜测是 -

压缩:

 (?:^|(?<=\s))((?!(?:hello|hi|bye)\s\()[a-zA-Z]+\s\()

展开:

 (?:
      ^ 
   |  (?<= \s )
 )
 (
      (?!
           (?: hello | hi | bye )
           \s \(
      )
      [a-zA-Z]+ \s \(
 )