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%的安全建议,我需要知道正则表达式的味道。你可以随时尝试。这和第一篇文章的结合很有效-非常感谢!