java online 為什麼(。*)*做兩個匹配,並且沒有在$ 1組中選擇任何內容?



perl regular expression online (1)

讓我們看看發生了什麼:

  1. (.*)匹配"input"
  2. "input"被捕獲到組1
  3. 正則表達式引擎現在位於字符串的末尾。 但是由於(.*)被重複,所以又進行了一次匹配嘗試:
  4. (.*)"input"後面的空字符串匹配。
  5. 空串被捕獲到組1 ,覆蓋"input"
  6. $1現在包含空字符串。

來自評論的一個好問題:

那麼為什麼replace("input", "(input)*", "A$1B")返回"AinputBAB"

  1. (input)*匹配"input" 。 它被替換為"AinputB"
  2. (input)*匹配空字符串。 它被替換為"AB"$1是空的,因為它沒有參與比賽)。
  3. 結果: "AinputBAB"

這來自正則化正則表達式語法的討論。 我已經看到了這個行為與幾個正則表達式分析器,因此我標記它與語言無關。

採取下面的表達式(調整你喜歡的語言):

replace("input", "(.*)*", "$1")

它會返回一個空字符串。 為什麼?

更奇怪的是,表達式replace("input", "(.*)*", "A$1B")將返回字符串ABAB 。 為什麼雙空比賽?

免責聲明:我知道回溯和貪婪的比賽,但杰弗里弗里德爾規定的規則似乎決定.*匹配一切,沒有進一步的回溯或匹配。 那麼為什麼$1空的?

注:(.+)*進行比較,返回輸入字符串。 但是, http://regexhero.com表明還有兩場比賽,這和上面的原因相似。





language-agnostic