在非捕获组中使用逻辑AND扩展正则表达式

时间:2016-04-25 13:59:37

标签: regex regex-negation

我想扩展现有的正则表达式字符串:

((?:street)|(?:addr)|(?:straße)|(?:strasse)|(?:adr))

它基本上匹配街道或地址等字符串。 所以现在我想补充说,如果字符串' addressAdd'或者' streetnr'存在它不再匹配任何东西(甚至不是街道)。

我试过了 ((?:street)|(?:addr)|(?:straße)|(?:strasse)|(?:adr))(^(?:addressAdd))(^(?:streetnr)) 然而,它的一些变化并没有成功。你们中的任何人都知道如何否定字符串吗?

更新:一些说明:如果存在addressAdd之类的字符串,我不希望任何字符串匹配。这个的java代码如下所示:

String toCheck="some string to match";
if((!toCheck.equals("streetnr") && !toCheck.equals("addressAdd")) && ( toCheck.equals("street") || toCheck.equals("strasse") || toCheck.equals("adr"))

1 个答案:

答案 0 :(得分:3)

我宁愿删除不必要的分组结构,并添加一个负面的预测,但有以下两个例外:

(?!addressAdd|streetnr)(?:street|addr|straße|strasse|adr)

请参阅regex demo

匹配整个单词:

\b(?!(?:addressAdd|streetnr)\b)(?:street|addr|straße|strasse|adr)\b

请参阅another demo

在这里,您可以阅读有关lookaheads的更多信息。简而言之:(?!addressAdd|streetnr)检查当前位置之后是否没有addressAddstreetnr,然后只有正则表达式引擎可以继续匹配(?:street|addr|straße|strasse|adr)中列出的其中一个备选项 - 捕捉团体。使用单词边界(\b(?!(?:addressAdd|streetnr)\b)),只会跳过那些整个单词的异常(因此,如果有streetnrs,则会匹配)。

回答更新: 要匹配包含特定子字符串且不包含不允许的整个字词的字符串(或未使用DOTALL选项的行),请在{{{}后面的模式开头使用否定前瞻1}}:

^

请参阅another regex demo