[英]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*
不能用這種方式表達。
我有兩個問題:
*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"
也不應該與regex
則regex
匹配。
正確的測試應該在像"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.