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

Extend an regex with logical AND in a non-capturing group

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

((?: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"))

我宁愿删除不必要的分组结构并添加负面前瞻,但有以下 2 个例外:

(?!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,它将被匹配)。

回复更新: 要匹配包含特定子字符串且不包含不允许的 whole 单词的字符串(或行,如果未使用 DOTALL 选项),请在模式右侧的开头使用否定先行在 ^ 之后:

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

another regex demo