我有正则表达式:
/(t0|t1)\.(?<column>(.*?))\s*(?<opt>(=|>=|<=|<|>|IN|LIKE))\s*(?<search>(.*|$))/i
应该标记化类生成子句的位置,以便将它们提供给外部Web服务。在区分大小写模式下,它可以正常工作,但不是在不区分大小写的模式下。请查看下面的演示。
如果有“in”字,则名称捕获组截断工作,例如
t0.date_finished > 'somedate'
我期待
[column =&gt; date_finished]
而不是
[column =&gt; date_f]
我缺少什么?
答案 0 :(得分:2)
您需要在IN
群组的LIKE
和opts
周围使用仅字词边界:
(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>.*)
^^^^^^^^^^^
[><]=|[=<>]
匹配>=
或<=
([><]=
部分)或(|
)a =
,{{1} },或<
。