使用Java中的regex,我想编写一个正则表达式,当且仅当模式前面没有特定字符时匹配。例如:

String s = "foobar barbar beachbar crowbar bar ";

我想匹配如果bar之前没有foo。因此输出将是:

barbar
beachbar
crowbar
bar

你想要像这样使用负向后:

\w*(?<!foo)bar

其中(?<!x)表示“仅当它在此点之前没有“x”时”。

参见正则表达式-查找更多信息。

编辑:增加\w*来捕获前面的字符(例如:“海滩”)。


另一种选择是首先匹配可选的单词字符,后面跟着bar,当匹配成功时,检查直接在左边的是不是foobar。

后视断言将首先在匹配栏后运行。

\w*bar(?<!foobar)

\w*匹配0+单词字符 匹配字面意思 (?<!foobar)负向后看,断言从当前位置foobar不是直接向左。

Regex演示


在某些情况下,可以更容易地选择包含前面的部分,然后在第二步中跳过这些匹配。例如,要查找以“+”开头的数字:

if (preg_match_all('/(\+?[0-9][0-9\s\-].*[0-9])/s',$text,$matches)) {
    foreach($matches[1] as $match) {
        if(substr($match,0,1) == '+'){
            continue;
        }
        // continue processing
    }
}

后面的反向查找不起作用,因为它仍然匹配2+数字,但它不包括匹配中的第一个数字。例如,+1234将返回为234。