2016-08-18 115 views
1

截斷的「中」字在名爲捕獲組I具有正則表達式:正則表達式中不區分大小寫的方式

/(t0|t1)\.(?<column>(.*?))\s*(?<opt>(=|>=|<=|<|>|IN|LIKE))\s*(?<search>(.*|$))/i 

這是應該標記化,其中的一類生成的條款,所以我它們饋送到外部web服務。在區分大小寫的模式下,它可以很好地工作,但不適用於不區分大小寫的模式。請檢查下面的演示。

如果有 「中」 字的名稱捕獲組爲

t0.date_finished > 'somedate' 

有例如截斷工作我期待

[柱=> date_finished]

代替我得到

[column => date_f]

我失蹤了什麼?

demo

+1

如果'= |> = |之前和之後總有空格, <=|<|> | IN | LIKE'然後你做這個'\ s +(?(= |> = | <=|<|> | IN | LIKE))\ s +'。 –

+0

@velblúd謝謝,這很有道理 – sakhunzai

+0

@velblúd請做出回答 – sakhunzai

回答

2

你需要用字邊界只有周圍INLIKEopts組:

(t0|t1)\.(?<column>.*?)\s*(?<opt>>=|<=|=|<|>|\b(?:IN|LIKE)\b)\s*(?<search>.*) 
              ^^^^^^^^^^^^^^^  

regex demo

此外,您不需要在命名捕獲組內捕獲組,我使用我的建議模式刪除它們。

如果你把周圍無字\b字邊界序列將只匹配後字字符之前(\b=\b將匹配在word1=word1字符串=)。

請注意,opt組中的較長備選方案必須在較短的備選方案之前進行。

而且,opt團可以與字符類被優化:

(t0|t1)\.(?<column>.*?)\s*(?<opt>[><]=|[=<>]|\b(?:IN|LIKE)\b)\s*(?<search>.*) 
           ^^^^^^^^^^^ 

[><]=|[=<>]其中匹配或者一個或>=<=(所述[><]=部分)或(|)一個=<,或>

+1

感謝您的更好的答案與精美的解釋。 –