2016-08-18 76 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

感谢您的更好的答案与精美的解释。 –