2014-03-12 58 views
3

question and its answers在這裏建議雙方:正則表達式和嵌套模式:什麼是明確的答案?

  1. 它可以使用正則表達式來匹配嵌套的模式。

  2. 而且這是不可能的,因爲嵌套模式不是常規語言,因此DFA(正則表達式)不能識別它們。

在閱讀上述問題的答案(https://stackoverflow.com/a/3851098/2876289)之前,我總是與2一起。但現在我不太確定。

'/(\((?>[^()]+|(?1))*\))/'

真正匹配嵌套的模式?

被問到 - 我在vim(和JavaScript)中嘗試了上述方法,但它不起作用。雖然也許它需要轉換成不同的語法。引用它的答案有9個upvotes。

回答

4

您必須賺取差價三件事情之間:有特點,處理嵌套的事情正則表達式的

  1. 實現。正則表達式的
  2. 實現,不具備這些特點的理論框架意義

情況下

  • 「正則表達式」 1:我知道兩個功能可以處理嵌套的括號(或其他東西)

    • 指捕獲組的子模式的能力,這就是你們的榜樣的情況下:

      (\((?>[^()]+|(?1))*\))

    (?1)指捕獲組1(內部本身獲得遞歸)

    此功能在PCRE正則表達式引擎(PHP,R,),Ruby中可用的(與oniguruma語法),在Perl,Python和XRegExp JavaScript庫,libboost的新的正則表達式模塊中...

    • 堆疊系統,就像在.NET:

      (?:[^()]|(?<Open>[(])|(?<-Open>[)]))*(?(Open)(?!))

    (看看this excellent post更多的信息。)

    案例2:實現,不具備這些功能的產品:Javascript,Python和Java的重新模塊...

    案例3:在一個理論意義上,「正則表達式」是一種常規語言的描述。由於不確定的嵌套層次不是一種常規語言,因此不能用「正則表達式」來描述。然而,重要的一點是,對'正則表達式'這個術語的接受與'正則表達式'(或'正則表達式')這個術語沒什麼關係,因爲它是常用的,也就是對語言的濫用。

  • +0

    好,謝謝。 – Cris

    相關問題