2014-10-08 24 views
0

我的正則表達式的代碼如下:正則表達式週期減去最後一個字符匹配一切

(.(?!\[view street map\]))+ 

這是爲了匹配的一切,直到[查看街道地圖。

但是,如果我在下面

Test of the system[view street map] 

使用這個表達式代碼它下面的匹配,並切斷了最後一個字符

Test of the syste 

任何人有爲什麼發生這種情況的任何想法?

在此先感謝!

回答

2

你應該消耗符之前的檢查:

^((?!\[view street map\]).)+ 

消費然後檢查不允許的字符串也錯誤地將字符串「[查看街景地圖]」匹配。

我忘記了在之前的版本中錨定。我們需要確保匹配從字符串的開始處開始,或者當引擎在下一個索引處重新匹配時可以繞過檢查。

+0

感謝您的解釋,是有道理的。 :) – DanielRHarris 2014-10-08 06:16:00

+0

爲什麼你的正則表達式在這裏失敗http://regex101.com/r/hQ1rP0/54v? – 2014-10-08 06:18:49

+2

但是,在字符串'[查看街道地圖]'上,現在會匹配'查看街道地圖]'。 – 2014-10-08 06:21:15

2

您必須添加起始錨以匹配所有內容,直到[view street map]如果[view street map]出現在該特定行上。如果[view street map]不存在,則它匹配整行。

^(?:(?!\[view street map\]).)+ 

DEMO

說明:

  • ^錨其表示一個行的開始。被稱爲非捕獲組。
  • (?:(?!\[view street map\]).)在正則表達式引擎匹配第一個字符之前,它會檢查邊界後面的字符串是否爲[view street map]。如果它是[view street map],那麼它不會匹配任何東西。如果它不是[view street map],那麼只有它匹配第一個字符。如果我們在整個非捕獲組之後添加+,則正則表達式引擎將從開始(不僅針對第一個字符)開始爲每個字符執行上述步驟。 +重複上一個令牌一次或多次。
+1

我想你應該解釋'的順序(?!)'和'.',除了你現在所擁有的,讓你回答站在其擁有。 – nhahtdh 2014-10-08 09:56:40

+0

@nhahtdh糾正我,如果我錯了.. – 2014-10-08 10:13:49

0

(.(?!\[view street map\]))+本質上說匹配一個字符,並檢查[view street map]是否在前。 m之前有[view street map]。所以它失敗了。其餘全部通過。

你可以試試:

\[view street map\]|(.) 

抓住捕獲並串連在一起得到的字符串。見demo

或者嘗試

\[view street map\] 

替換爲空字符串。見demo

+0

這種方法的問題是您將在捕獲組中獲得單個字符,並且必須將它們連接在一起以獲取字符串。 – nhahtdh 2014-10-08 10:05:12

0

您當前的邏輯 - 逐個取所有符號,每個符號都不會跟着[view street map]。您可以將邏輯更改爲以下內容 - 採用批號後跟[view street map]end-of-string

.*?(?=(?:\[view street map\])|$) 

Regular expression visualization

Demo

+0

爲什麼它在這裏失敗http://regex101.com/r/tD6vY9/2? – 2014-10-08 06:49:42

+0

@AvinashRaj請定義'失敗'。你使用'g'修飾符,當然在'hello [view street map]中'會找到4個匹配項。我故意沒有指定'g'修飾符,以便只返回第一個匹配項(所需的)。 – 2014-10-08 07:16:18

+0

抱歉,PHP使用全局修飾符作爲默認值。 – 2014-10-08 07:17:09

相關問題