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

Regex 在非捕获组中使用逻辑AND扩展正则表达式,regex,regex-negation,Regex,Regex Negation,我想扩展现有的正则表达式字符串: ((?:street)|(?:addr)|(?:straße)|(?:strasse)|(?:adr)) 它基本上匹配像street或address这样的字符串。 现在我想补充一点,如果字符串“addressAdd”或“streetnr”存在,它将不再匹配任何内容(甚至是street) 我试过了 ((?:street)|(?:addr)|(?:straße)|(?:strasse)|(?:adr))(^(?:address))(^(?:streetnr)) 然而

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

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

它基本上匹配像street或address这样的字符串。 现在我想补充一点,如果字符串“addressAdd”或“streetnr”存在,它将不再匹配任何内容(甚至是street)

我试过了
((?:street)|(?:addr)|(?:straße)|(?:strasse)|(?:adr))(^(?:address))(^(?:streetnr))
然而,其中的一些变体并没有成功。你们中有人知道如何对字符串求反吗

更新:一些澄清:如果存在类似
address
的字符串,我不希望任何字符串匹配。这方面的java代码如下所示:

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

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

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

要匹配整个单词:

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

在这里,你可以阅读更多关于。简而言之:
(?!address add | streetnr)
检查当前位置后是否没有
address add
streetnr
,只有这样,正则表达式引擎才能继续匹配
中列出的备选方案之一(?:street | addr | stra | e | strasse | adr)
非捕获组。使用单词边界(
\b(?(?:address add | streetnr)\b)
)时,只跳过那些属于整个单词的例外情况(因此,如果存在
streetnrs
,则会进行匹配)

对更新的回答: 若要匹配包含特定子字符串且不包含不允许的整词的字符串(如果未使用
DOTALL
选项,则为行),请在模式开头的
^
后面使用负前视:

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

请参见

所有这些非捕获组都是为了什么?!用
\bstreet\b
替换
(?:street)
,必要时为所有子字符串添加
\b
。感谢这是其中一部分,但我需要的行为是,如果“addressAdd”或“streetnr”存在,则所有字符串都不匹配(不再匹配)。因此,如果其中一个字符串出现,它基本上可以中止其余的检查…您的意思是不想获取包含
address
streetnr
的字符串吗?这要容易得多,但要给出100%的安全建议,我需要知道正则表达式的味道。你可以随时尝试。这和第一篇文章的结合很有效-非常感谢!