我的正則表達式的代碼如下:正則表達式週期減去最後一個字符匹配一切
(.(?!\[view street map\]))+
這是爲了匹配的一切,直到[查看街道地圖。
但是,如果我在下面
Test of the system[view street map]
使用這個表達式代碼它下面的匹配,並切斷了最後一個字符
Test of the syste
任何人有爲什麼發生這種情況的任何想法?
在此先感謝!
我的正則表達式的代碼如下:正則表達式週期減去最後一個字符匹配一切
(.(?!\[view street map\]))+
這是爲了匹配的一切,直到[查看街道地圖。
但是,如果我在下面
Test of the system[view street map]
使用這個表達式代碼它下面的匹配,並切斷了最後一個字符
Test of the syste
任何人有爲什麼發生這種情況的任何想法?
在此先感謝!
你應該消耗符之前的檢查:
^((?!\[view street map\]).)+
消費然後檢查不允許的字符串也錯誤地將字符串「[查看街景地圖]」匹配。
我忘記了在之前的版本中錨定。我們需要確保匹配從字符串的開始處開始,或者當引擎在下一個索引處重新匹配時可以繞過檢查。
您必須添加起始錨以匹配所有內容,直到[view street map]
如果[view street map]
出現在該特定行上。如果[view street map]
不存在,則它匹配整行。
^(?:(?!\[view street map\]).)+
說明:
^
錨其表示一個行的開始。被稱爲非捕獲組。(?:(?!\[view street map\]).)
在正則表達式引擎匹配第一個字符之前,它會檢查邊界後面的字符串是否爲[view street map]
。如果它是[view street map]
,那麼它不會匹配任何東西。如果它不是[view street map]
,那麼只有它匹配第一個字符。如果我們在整個非捕獲組之後添加+
,則正則表達式引擎將從開始(不僅針對第一個字符)開始爲每個字符執行上述步驟。 +
重複上一個令牌一次或多次。我想你應該解釋'的順序(?!)'和'.',除了你現在所擁有的,讓你回答站在其擁有。 – nhahtdh 2014-10-08 09:56:40
@nhahtdh糾正我,如果我錯了.. – 2014-10-08 10:13:49
您當前的邏輯 - 逐個取所有符號,每個符號都不會跟着[view street map]
。您可以將邏輯更改爲以下內容 - 採用批號後跟[view street map]
或end-of-string
。
.*?(?=(?:\[view street map\])|$)
爲什麼它在這裏失敗http://regex101.com/r/tD6vY9/2? – 2014-10-08 06:49:42
@AvinashRaj請定義'失敗'。你使用'g'修飾符,當然在'hello [view street map]中'會找到4個匹配項。我故意沒有指定'g'修飾符,以便只返回第一個匹配項(所需的)。 – 2014-10-08 07:16:18
抱歉,PHP使用全局修飾符作爲默認值。 – 2014-10-08 07:17:09
感謝您的解釋,是有道理的。 :) – DanielRHarris 2014-10-08 06:16:00
爲什麼你的正則表達式在這裏失敗http://regex101.com/r/hQ1rP0/54v? – 2014-10-08 06:18:49
但是,在字符串'[查看街道地圖]'上,現在會匹配'查看街道地圖]'。 – 2014-10-08 06:21:15