在非捕获组中使用逻辑 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)
要匹配整个单词:
\b(?!(?:addressAdd|streetnr)\b)(?:street|addr|straße|strasse|adr)\b
在这里,您可以阅读更多关于 lookaheads 的信息。简而言之:(?!addressAdd|streetnr)
检查当前位置后是否没有 addressAdd
和 streetnr
,只有这样正则表达式引擎才能继续匹配 (?:street|addr|straße|strasse|adr)
中列出的备选方案之一-捕获组。对于单词边界 (\b(?!(?:addressAdd|streetnr)\b)
),只有那些完整单词的例外才会被跳过(因此,如果有 streetnrs
,它将被匹配)。
回复更新:
要匹配包含特定子字符串且不包含不允许的 whole 单词的字符串(或行,如果未使用 DOTALL
选项),请在模式右侧的开头使用否定先行在 ^
之后:
^(?!.*\b(?:addressAdd|streetnr)\b).*(?:street|addr|straße|strasse|adr).*
我想扩展现有的正则表达式字符串:
((?: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)
要匹配整个单词:
\b(?!(?:addressAdd|streetnr)\b)(?:street|addr|straße|strasse|adr)\b
在这里,您可以阅读更多关于 lookaheads 的信息。简而言之:(?!addressAdd|streetnr)
检查当前位置后是否没有 addressAdd
和 streetnr
,只有这样正则表达式引擎才能继续匹配 (?:street|addr|straße|strasse|adr)
中列出的备选方案之一-捕获组。对于单词边界 (\b(?!(?:addressAdd|streetnr)\b)
),只有那些完整单词的例外才会被跳过(因此,如果有 streetnrs
,它将被匹配)。
回复更新:
要匹配包含特定子字符串且不包含不允许的 whole 单词的字符串(或行,如果未使用 DOTALL
选项),请在模式右侧的开头使用否定先行在 ^
之后:
^(?!.*\b(?:addressAdd|streetnr)\b).*(?:street|addr|straße|strasse|adr).*