簡體   English   中英

概括了UNIX風格的正則表達式的抽取引理

[英]generalizing the pumping lemma for UNIX-style regular expressions

除了通常的**+?*運算符之外,大多數UNIX正則表達式都有一個反斜杠運算符,其中\\1,\\2,...匹配最后一個括號中的任何內容,例如*L=(a*)b\\1*匹配(非常規)語言*a^nba^n*

一方面,這似乎非常強大,因為您可以創建(a*)b\\1b\\1以匹配語言*a^nba^nba^n*甚至無法被堆棧自動機識別。 另一方面,我很確定*a^nb^n*不能用這種方式表達。

我有兩個問題:

  1. 是否有關於這一系列語言的文獻(UNIX-y常規)。 特別是,這些泵浦引理是否有一個版本?
  2. 有人可以證明或反駁*a^nb^n*不能用這種方式表達嗎?

你可能正在尋找

當然,可以前后跟進他們的引用,以找到更多關於這個主題的文獻。

a ^ nb ^ n是CFL。 語法是

A -> aAb | e

你可以使用抽氣引理來證明A不是RL

Ruby 1.9.1支持以下正則表達式:

regex = %r{ (?<foo> a\g<foo>a | b\g<foo>b | c) }x

p regex.match("aaacbbb")
# the result is #<MatchData "c" foo:"c">

Ruby 1.9正則表達式的樂趣 ”有一個例子,他實際上安排了一個正則表達式的所有部分,使它看起來像一個無上下文的語法,如下所示:

sentence = %r{ 
    (?<subject>   cat   | dog   | gerbil    ){0} 
    (?<verb>      eats  | drinks| generates ){0} 
    (?<object>    water | bones | PDFs      ){0} 
    (?<adjective> big   | small | smelly    ){0} 

    (?<opt_adj>   (\g<adjective>\s)?     ){0} 

    The\s\g<opt_adj>\g<subject>\s\g<verb>\s\g<opt_adj>\g<object> 
}x

我認為這意味着至少Ruby 1.9.1的正則表達式引擎,即Oniguruma正則表達式引擎,實際上相當於無上下文語法,盡管捕獲組並不像實際的解析器生成器那樣有用。

這意味着“ 無上下文語言的抽取引理 ”應該描述Ruby 1.9.1的正則表達式引擎可識別的語言類。

編輯:哎呀! 我搞砸了,並沒有做一個重要的測試,這實際上使我的答案完全錯誤。 我不會刪除答案,因為它仍然是有用的信息。

regex = %r{\A(?<foo> a\g<foo>a | b\g<foo>b | c)\Z}x
#I added anchors for the beginning and end of the string
regex.match("aaacbbb")
#returns nil, indicating that no match is possible with recursive capturing groups.

編輯:幾個月后回到這里,我剛剛發現我在上次編輯中的測試不正確。 即使regex像無上下文語法一樣運行, "aaacbbb"也不應該與regexregex匹配。

正確的測試應該在像"aabcbaa"這樣的字符串上,並且與正則表達式匹配:

regex = %r{\A(?<foo> a\g<foo>a | b\g<foo>b | c)\Z}x
regex.match("aaacaaa")
# => #<MatchData "aaacaaa" foo:"aaacaaa">
regex.match("aacaa")
# => #<MatchData "aacaa" foo:"aacaa">
regex.match("aabcbaa")
# => #<MatchData "aabcbaa" foo:"aabcbaa">

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM