正则表达式,用于匹配前面没有其他内容的内容

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

String s = "foobar barbar beachbar crowbar bar ";

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

barbar
beachbar
crowbar
bar
148340 次浏览

你想像这样使用negative lookbehind:

\w*(?<!foo)bar

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

更多信息请参见正则表达式-查看

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

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

回溯断言将在首先匹配bar之后运行。

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

Regex demo

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

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。