2016-04-25 44 views
1

我想擴展現有的正則表達式的字符串:擴展的正則表達式用邏輯與在非捕獲組

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

什麼是所有那些非捕獲組進行? – Biffen

+0

用'\ bstreet \ b'替換'(?:street)',如果需要的話,同樣爲所有子字符串添加'\ b'。 –

回答

3

我寧願刪除不必要的分組結構,並添加負前瞻與這些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,它將得到匹配)。

回答到更新: 要(如果不使用DOTALL選項或線)相匹配的字符串包含特定字符串,不包含禁止整個的話,使用負先行在模式一開始就^後:

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

another regex demo

+0

謝謝,這是其中的一部分,但我需要的行爲是,如果存在「addressAdd」或「streetnr」,則任何字符串都不會匹配(不再)。因此,如果其中一個字符串出現,它基本上可以中止其餘的檢查... – Lonzak

+0

您的意思是您不想獲取包含* addressAdd或* streetnr的字符串嗎?這很容易,但爲了給出100%的安全建議,我需要知道它是什麼樣的正則表達式。您可以隨時嘗試['^(?!。* \ b(?:addressAdd | streetnr)\ b)。+'](https://regex101.com/r/yU1iL3/1)。 –

+0

該組合和第一篇文章的作品 - 感謝很多! – Lonzak