我希望匹配文字形式的所有文字( - 即:文字后跟空格,然后打开括号。但如果文字属于“嗨“或”你好“或”再见“,那就不应该匹配了。
所以我正在寻找以下结果:
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中我得到了理想的结果。
答案 0 :(得分:2)
您的正则表达式不起作用,因为它始终与文字和(
之间的空格匹配(因为空格匹配(^|\s)
且(
不匹配((hello|hi|bye)(\s\())
)。它还应该匹配许多其他地方的空间。
Test to show what yours matches
这个正则表达式应该有效:
\b(?!(?:hello|hi|bye)\s)\w+\s\(
<强>解释强>
\b
- 字边界。
(?!(?:hello|hi|bye)\s)
- 对hello
,hi
或bye
进行负面预测,后跟空格。
它后跟一个空格,所以我们匹配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\(
匹配字符串的开头,然后可选地匹配任何字符,但不能在字符串的开头匹配hello
,hi
或bye
,然后是空格,然后是打开的括号。
答案 2 :(得分:0)
我的猜测是 -
压缩:
(?:^|(?<=\s))((?!(?:hello|hi|bye)\s\()[a-zA-Z]+\s\()
展开:
(?:
^
| (?<= \s )
)
(
(?!
(?: hello | hi | bye )
\s \(
)
[a-zA-Z]+ \s \(
)