2010-02-02 67 views
3

我需要匹配一些運算符:=,!=,>,<,< =,> = 我需要匹配的字符串可能類似於:「2 = 2 OR 33> = 32 AND 3 < 5"正則表達式幫助匹配運算符

什麼可以是正則表達式匹配表達式這一點,知道 - 我不希望收到一個‘< =’操作 一個‘=’匹配 - 的運營商可能會或可能不會有周圍的空間

在此先感謝! 亞歷

+0

你會最終會解析表達式與他們(嵌套)括號? – 2010-02-02 11:49:27

+0

我正在評估這些表達式,並且它可以是c#編譯器可以理解的任何東西。 這將成爲規則引擎的一部分,可以接受2種表達類型,c#和僞代碼。 僞代碼可以讓你設計你的規則很像TFS查詢生成器,但是如果你需要更快,預編譯和更復雜的規則,你需要用c#編寫它們。 這個表達式將用於去除僞代碼表達式,但是括號和組運算符(AND/OR)的評估順序將留給c#編譯器來處理:) – AlexCode 2010-02-02 12:23:30

+0

如果'Left/Right Operand'包含引號,你需要檢查他們是否關閉。 – serhio 2010-02-02 15:48:01

回答

9

試試這個:

(<=|>=|!=|=|>|<) 
+3

+1你是對的,Kobi的版本很優雅,但是你的可讀性更強...... :)都得到了+1 – tanascius 2010-02-02 11:45:50

+2

請注意這些的順序很重要。如果列表中的第一個小於號,則匹配<='會將每個字符作爲單獨的匹配返回。 – 2010-02-02 11:45:59

+0

我完全同意tanascius的可讀性評論+1。 – Kobi 2010-02-02 11:46:54

4

這似乎工作:

[<>!]?=|[<>] 

這需要:<>!=(或只是=)之前,
OR:<>它們對。

這就是說,對於更多的複雜性,你可能需要一個解析器(例如,如果你想支持括號)

+0

+1,優雅的解決方案 – 2010-02-02 11:44:37

+1

(我正在刷新頁面,渴望一個downvoter來解釋我的錯在哪裏,因此,也許,學習一些新的東西) – Kobi 2010-02-02 11:50:36

+0

用http://derekslager.com/blog/posts /2007/09/a-better-dotnet-regular-expression-tester.ashx來源'=,!=,>,<, <=, > ='只能找到來自6的4個匹配項,不明白爲什麼... – serhio 2010-02-02 11:52:44

1

我的建議:[<>]=?|[!=]?=。匹配= != > < <= >= ==中的任何一個。

+0

不錯的一個。如果沒有'==',它可以是一個整潔的'[<>] =?|!?=' – Kobi 2010-02-02 13:05:38

+0

我的僞碼操作符可以演化爲更復雜的像'LIKE'運算符來比較字符串,所以我可能需要添加更多的運算符到可能與這些最初的不同的搜索模式。 我需要一個簡單的模式,凸輪隨着工具發展而不必重新考慮一個全新的工具,每次我想爲一個新的操作員添加suppor。 – AlexCode 2010-02-02 14:51:09

0

你是否也試圖獲得數字?如果是的話。 。 。

/[0-9]+[ ]*(<=|>=|!=|=|>|<)[ ]*[0-9]+/ 

...在0-9一次或多次的範圍內什麼,其次是0或多個空格,然後你的運營商,0或多個空格以及任何在0-9的一個或多個範圍倍。

這將讓數和操作

+0

在這裏,你會得到另一個問題集:該數字可以是負數,有小數位等 – 2010-02-02 12:45:38

+0

真的,在這種情況下,最好重寫正則表達式來匹配它。我總是覺得最好是最完整的。如果你正在尋找複雜的,真實的,整數,整數或其他類型的數字,你應該編寫正則表達式來匹配,而不是讓它模棱兩可,以後可能會遇到麻煩。 – Toymakerii 2010-02-02 14:10:31

+0

不,我只是爲了識別操作符及其左右操作數和聚合操作符(如果有的話)(AND/OR)。 在我的例子中,我只寫了數字,但我的操作數可以是任何有效的C#編譯器成功編譯,這是從簡單的CLR類型到複雜的自定義類型。 所以我不介意用戶編寫的操作數是什麼,只要它編譯和評估對我來說很好。 – AlexCode 2010-02-02 14:46:42

1

[^?!><=]+\s*(?<operator>[><!]?=|[><])\s*[^?!><=]+ + ExplicitCapture

過濾器>>===== ==

+0

在搜索運算符之前,我首先通過邏輯運算符(AND/OR)拆分表達式。每個邏輯運算符之間只能有一個規則條件(左操作數,右操作數,右操作數)。 因此,如果在邏輯運算符之間找到多於一個運算符,解析器將自動拋出「無效的Empression」異常。 這樣我就不需要對RegEx模式執行任何驗證。 – AlexCode 2010-02-02 14:57:44

+0

我在想,我可能需要執行一個驗證壽命...我需要跳過引號之間的運算符。如果一個操作數是一個包含操作符的字符串,可能會發生這種情況,例如:「Alex」=「」 – AlexCode 2010-02-02 14:59:48

+0

如果您的操作數包含引號,則需要檢查它們是否關閉。 – serhio 2010-02-02 15:37:29