我想扩展现有的正则表达式字符串:
((?: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"))
答案 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)
检查当前位置之后是否没有addressAdd
和streetnr
,然后只有正则表达式引擎可以继续匹配(?:street|addr|straße|strasse|adr)
中列出的其中一个备选项 - 捕捉团体。使用单词边界(\b(?!(?:addressAdd|streetnr)\b)
),只会跳过那些整个单词的异常(因此,如果有streetnrs
,则会匹配)。
回答更新:
要匹配包含特定子字符串且不包含不允许的整个字词的字符串(或未使用DOTALL
选项的行),请在{{{}后面的模式开头使用否定前瞻1}}:
^