2011-09-22 90 views
11

例子:量詞{0}在某些情況下是否有意義?

/(?:富){0}酒吧/

我看到這樣的事情在另一個答案。起初我認爲「應該是什麼」,但是,「好的可能有意義,有點負面的背後」,所以在bar之前不允許Foo,但這是行不通的。

你可以看到這個here on Regexr:它只匹配bar,但它也匹配Foobar中的bar
當我添加錨點該行的開始:

/^(?:Foo){0}bar/ 

它像我期望的那樣。它僅匹配bar而不匹配Foobar中的bar

但是,這是完全一樣的行爲,如果我只使用/bar//^bar/

量詞{0}只是無用的副作用,還是真的有一個有用的行爲呢?

回答

11

還有用途{0}。它允許您定義定義您目前不打算捕獲的組。這在某些情況下可能會有用:

  • 在遞歸正則表達式(或其他奇怪的構造)中使用組的最佳方法之一。例如,Perl對於相同的用途有(?(DEFINE))
    一個簡單的例子 - 在PHP中,這將匹配barFooworking example):

    preg_match("/(?:(Foo)){0}bar(?1)/", "barFoo", $matches); 
    
  • 添加一個失敗的捕獲組(命名或編號)到結果的比賽。

  • 在模式被重構的情況下保持所有組的指數不變。

少好用途,彼得建議是有用的:

  • 生成模式。
  • 可讀性 - 有一定重複的模式,其中{0}{1}可能會導致思考的方向正確。 (好吧,不是最好的一點)

這些都是罕見的情況,在大多數情況下,這是一個錯誤。

+0

這真棒,Kobi。這隻適用於具有子例程但不包含'(?(DEFINE))'的引擎,我認爲這只是Ruby,可能還有帶'regex'模塊的Python。在Ruby中測試:'(?:(Foo)){0} bar \ g <1>'+1000! – zx81

+1

如果有人感興趣,不要使用'regex'模塊在Python中工作。但想出了這個替代方案,它的作用:'(?:(Foo)$ ^)?bar(?1)' – zx81

2

在傳統的正則表達式,/x{0}/(語言= {X Ñ:X = 0})將意味着 「匹配x的準確0」,這是同樣的事情//(語言= {Λ})。由於這兩者是相同的,因此您應該能夠刪除您發現的任何/x{0}/

但PCRE和正則表達式的其他擴展可以得到相當的拜占庭式。如果/x{0}/在Perl中做了某些事情,我不會感到驚訝。我會感到厭惡,但並不感到驚訝。

我認爲這可能是程序的某些工件自動生成正則表達式,但不會簡化它們。這是一個恥辱,因爲編寫簡化正則表達式的程序非常簡單。

+0

_「我會反感,但不會感到驚訝。」_ :) –

+0

編寫簡化正則表達式的程序真的很容易嗎?這聽起來很有趣...... – Kobi

3

在自動生成的正則表達式中,顯式重複計數爲零可能很有用。您避免使用這種方法爲零重複編碼一個特殊情況。

2

我想不出一個很好的理由來使用x{0}。但我可以想到幾個爲什麼應該避免:

  • 它是無用的,因爲它總是匹配。
  • 它減慢了正則表達式引擎的速度(除非正則表達式是預編譯的)。
  • 這可能是正則表達式作者誤解的標誌。

我敢打賭,有人誰寫(?:foo){0}試圖說「確保foo不匹配這裏」,這當然是失敗,因爲空字符串總是可以匹配,是否foo有沒有。這就是負面的觀察斷言。 (?<!foo)bar

相關問題