2014-05-09 175 views
5

我正在通過有關正則表達式的練習,而且我很不確定如何做到這一點。簡化正則表達式

正則表達式是:

((a*)(b*))*U(a*) 

我在這個非常糟糕,但我認爲((a*)(b*))*可以簡化爲(a U b)*但是,如果這是正確的,比上屆U(a*)其實只是重複,所以我認爲整個表達式可以簡化爲(a U b)*.這看起來是否正確?

編輯︰ü代表工會

+2

'U'代表工會嗎?也就是說,對於'(a U b)*',你實際上是指在正則表達式中用'(a | b)*'或'[ab] *'表示什麼?因爲如果你認爲這樣的模式看起來就像你所建議的那樣只是'(a | b)*'。 –

+1

如果'U'被認爲是「聯合」,那麼使用正確的符號('∪') - 或者至少在文本中聲明它是適當的。 – Tomalak

+0

現在編輯文本:) – user2795095

回答

3

你是對的。 (a*b*)*可以匹配a和b的任何字符串,所以它們可以相等。 (a U b)*相交a*a*所以a*(a U b)*的子集。因此,整個表達式可以簡化爲(a U b)*

+0

你錯了。 '(a U b)*'將與文字'a U b'匹配零次或多次。它不再是原始正則表達式的意圖匹配。 – Deele

+0

你爲什麼這麼說? Union和OR是完全一樣的東西。這個問題是關於正式的正式語言。 – perreal

+0

他們不是在正則表達式的情況下。 '(a | b)*'也是錯誤的表達。 OP沒有聲明他在詢問_format正式語言_或類似的東西。他添加了'regex'標籤並詢問了正則表達式。所以問題應該是downvoted,你應該使用適當的正則表達式符號,來回答正則表達式問題。表達式中使用的每個字符都計數 – Deele

-2

的真正含義是什麼((a*)(b*))*U(a*)是(從here複製)

NODE      EXPLANATION 
-------------------------------------------------------------------------------- 
    (      group and capture to \1 (0 or more times 
          (matching the most amount possible)): 
-------------------------------------------------------------------------------- 
    (      group and capture to \2: 
-------------------------------------------------------------------------------- 
     a*      'a' (0 or more times (matching the 
           most amount possible)) 
-------------------------------------------------------------------------------- 
    )      end of \2 
-------------------------------------------------------------------------------- 
    (      group and capture to \3: 
-------------------------------------------------------------------------------- 
     b*      'b' (0 or more times (matching the 
           most amount possible)) 
-------------------------------------------------------------------------------- 
    )      end of \3 
-------------------------------------------------------------------------------- 
)*      end of \1 (NOTE: because you are using a 
          quantifier on this capture, only the LAST 
          repetition of the captured pattern will be 
          stored in \1) 
-------------------------------------------------------------------------------- 
    U      'U' 
-------------------------------------------------------------------------------- 
    (      group and capture to \4: 
-------------------------------------------------------------------------------- 
    a*      'a' (0 or more times (matching the most 
          amount possible)) 
-------------------------------------------------------------------------------- 
)      end of \4 

這個表達式目前匹配所有這些序列:abUa bU U aabbUaa aaUaa aaU Uaa bbU ababUaa aabbaabbUaa(看here

有沒有辦法來簡化這一點,而不刪除捕獲組和剩餘的字母順序。

編輯:如果您的正則表達式中的U代表「union」,那麼這個表達式是無效的。在正則表達式中沒有辦法聯合任何東西。只有OR,你需要使用|(管道)。如果你想要工會((a*)(b*))*(a*)那麼可能它會是((a*)(b*))*,但它仍然會匹配abaab之類的東西。

儘管如此,在您的正則表達式語句中捕獲組是無用的,所以類似[ab]*就足以匹配任何數量的ab's。

+0

沒有捕獲,它們是OP中的非捕獲組。 – perreal

+0

因爲在這種情況下'U'代表聯合(見OP的問題的評論),你的解釋不幸是不正確的(它假設'U'是字符'U'')。這很模糊,但不是你的錯。 –

+0

@perreal非捕獲組是'(?:)'OP使用'()' – Deele