2013-03-16 89 views
5

我正在開發一個項目,用戶輸入一個帶有 AND OR運算符的人類可讀搜索字符串。 我給三個例子將用戶輸入轉換爲正則表達式

  1. 一個AND(B或C) - >(= \ BA \ B')(=(\ BB \ b)中|?(\ BC \ B))。 *
  2. A或(b和C)
  3. (A或b)和(c或d)

以上是輸入我可能得到的樣品。 我想要輸入並將其轉換爲正則表達式。 這不是編譯器的示例嗎?看看它,我看到 ,我想要做的是將高級命令 轉換爲低級別命令。你對 有什麼建議,我怎麼能完成上述?我想要的是,將正在生成的 正則表達式傳遞給jsoup(僞選擇器:matchesOwn) 並查詢html文檔。 謝謝你的幫助。

+0

如果你有嵌套括號像這樣'(()())((())())',你不能在Java正則表達式解析它。 – nhahtdh 2013-03-16 11:55:04

+0

謝謝你的迴應。我不想用正則表達式解析輸入,我想將它轉換爲正則表達式。我不問用戶給我的正則表達式,而是問他一個更可讀的版本。 – alkis 2013-03-16 12:00:02

+0

你將如何處理這樣的事實,即正則表達式有順序,但搜索字符串沒有。如果用戶輸入'foo AND bar',他們希望'bar foo'與您的示例不符。或者你會產生每一個排列。 – user1937198 2013-03-16 12:05:22

回答

5

這樣做的一般方法是以易於遍歷的數據結構的形式進行中間表示。這通常被稱爲AST。如果你對這個概念不熟悉,可以看看calculator-ast,它對計算器語言進行了這種轉換。

爲了將用戶輸入字符串轉換爲AST,您需要使用解析器。你可以看看antlr。我個人使用v3,v4似乎不太成熟。看看antlr3.org。如果你想自己寫解析器,你可以拍攝一個pratt parser。這不是微不足道的,整合好的錯誤處理需要時間,但它可能是一個有趣的練習。

一旦你有一個AST,把它變成一個正則表達式應該是通過遍歷AST和你一起去輸出字符微不足道。

祝你好運!

+0

您的回答非常有幫助。所以它是以一種非常抽象的思維方式,一個小編譯器...... – alkis 2013-03-16 12:23:00

+2

是的!而這樣的小語言是開始熟悉編譯器技術和術語的好方法。玩的開心。 – 2013-03-16 12:24:57

相關問題