2009-08-12 75 views
0

是否有可能轉換適當地形成(在括號中的術語)表達如使用正則表達式來評估搜索查詢

((a和b)或c)和d

成一個正則表達式,並使用Java或其他語言的內置引擎,輸入術語如ABCDE(不區分大小寫......)?

到目前爲止,我嘗試了(b)(^。?)(a | e)*作爲搜索b和(a或e)的一些內容,但它並沒有真正實現。我正在尋找它來匹配字符'b'和任何出現在輸入字符串中的'a'或'e'。

關於這個過程 - 我正在考慮將輸入字符串拆分成一個數組(基於這個正則表達式)並接收匹配的字符作爲輸出(或者如果AND/OR條件沒有滿足,則爲none)。我對Regex比較陌生,沒有花很多時間,所以我很抱歉,如果我問的是不可能的,或者答案是非常明顯的。

感謝您的回覆。

+0

這是一個解析器的典型案例:計數開合括號。 – Gumbo 2009-08-12 20:27:46

+0

用我正在考慮的方法的一個例子來編輯問題。 – raptors 2009-08-12 20:38:05

+0

我已經決定採用更傳統的遞歸字符串搜索方法,如下所示。我希望會有一些簡單的正則表達式的方式,但只能希望...感謝您的快速回復。 – raptors 2009-08-12 21:09:57

回答

1

帶平衡圓括號的字符串語言不是普通語言,這意味着沒有(純粹的)正則表達式會匹配它。

這是因爲需要某種內存構造(通常是堆棧)來維護開放的括號。

也就是說,許多語言提供regexes遞歸評估,特別是Perl。我不知道細節,但是我不打擾他們,因爲你可以編寫自己的解析器。

只需遍歷字符串中的每個字符並跟蹤開放括號和一堆字符串的計數器即可。當你到達一個開放的圓括號時,將堆棧推入並將不包含括號的字符放入堆棧的字符串中。當你得到一個封閉的圓括號時,評估你建立的表達式並將結果存儲到堆棧頂部的字符串的後面。

再次,我不完全確定我明白你在做什麼。我道歉,如果這沒有幫助。

+0

我試圖在使用普通字符串比較工作之前得到一個遞歸解決方案,但是我認爲這可能是一個使用正則表達式的簡單方法。感謝您的建議。 – raptors 2009-08-12 21:12:05

0

不是。正則表達式在計算上不夠強大,不足以確保開始和結束括號匹配。你需要一些可以用形式語法來描述它的東西。

1

我並不完全確定我明白你想要做什麼,但是這裏有一些可能的幫助。開始像

 
((a and b) or c) and d 

,並使之通過這些賦值語句:

 
s/or/|/g 
s/and| //g 
s/([^()|])/(?=.*$1)/g 

這會給你

 
(((?=.*a)(?=.*b))|(?=.*c))(?=.*d) 

這是一個正則表達式將匹配你想要的。

+0

我無法通過在線測試程序(如http://regexpal.com/)獲得此工作。謝謝,但我決定採用更傳統的遞歸字符串搜索方法,如上所述。 – raptors 2009-08-12 21:08:08

+0

不幸的是,有不同的正則表達式引擎。 (?= foo)是Perl可以處理的「向前看」,但顯然regexpal不能。我不知道你在用什麼,但我的方法在Perl下工作,根據regextester,Javascript。 – Beta 2009-08-12 21:29:13