2011-12-14 104 views
-2

我想出了一些任務這個正則表達式(0|10)*。我的朋友不認爲這可以識別字符串0*100*。 (請不要給我一個正則表達式來識別這個字符串,我知道如何自己做,但是我想出的正則表達式除了識別這個字符串外,還有其他的一些問題。你們有多少人認爲它識別字符串0*100*?我希望它。爲了說服自己,我試圖將模式與grep相匹配,並且它與它匹配。例如,以下命令匹配echo中的模式,這意味着我的正則表達式是正確的。不是嗎?這RegEx匹配提到的模式

echo 00000000000000100000000000 | grep '\(0\|10\)*' 
+0

假設字符串'0 * 100 *`中的星號真的存在,那麼您的正則表達式`(0 | 10)*`只會匹配第一個0 ... – BoltClock 2011-12-14 18:11:37

+0

您是對的。您的模式匹配{0,1}中沒有兩個連續字的單詞,並以零結尾(以及空字符串)。您可能希望`(0 | 10)* 1?`還包含以1結尾的單詞。 – Kobi 2011-12-14 18:12:35

回答

0

是的,它在我看來是認可的。 1是不可能的,01也不可能。你的模式無法完成1。

2

它絕對匹配。你基本上是說

匹配的字符串我哪裏有0或10重複任意 次

現在採取0 * 100 *,並在組分爲:

  1. 0 *匹配,因爲它重複任意次數爲0。
  2. 10個匹配,因爲它重複10次。
  3. 0 *是一樣的1

編輯:我們也嘗試了正式的證明:

(0 | 10)* - >相應的語法:

A -> 0|10|e 
B -> BA|AB 

等同形式:

A -> 0|10|e|0A|10A|A0|A10 

0 * 100 * - >對應語法:

A -> 0|0A|A0|e 
B -> 10 
C -> ABA 

等效形式:

A -> 10|0A|A0 

我們可以看到,第二文法的產品有所述第一語法的製作的一個子集,因此第一語法應匹配由第二語法產生的任何表達。

0

請注意,您的表達式不匹配整個模式。它匹配模式中間的「10」。請嘗試echo 00000000000000100000000000 | grep --color=always '(0\|10)*'以查看您匹配的表達式的哪一部分。如果您使用^(0\|10)*$強制整個字符串匹配,它將不匹配。我不確定你是否想要匹配整個字符串。如果您使用擴展正則表達式(egrep或grep -E),它將匹配整個字符串。所以它真的很重要,正是你正在談論的正則表達式的味道。