关系运算符和引用值的正则表达式

时间:2012-09-22 13:15:30

标签: regex

我有一个SQL查询。我想允许用户仅修改单引号中的关系运算符或值

我的输入字符串是。

Select * from defect where Quantity < '9' and Date <= curdate() and Date >=
date_sub(curdate(), interval '3' month)

我正在尝试按照模式匹配上面的字符串。我也开始尝试^和结尾的$。但无论如何都没有积极的结果

1. Select * from defect where Quantity [<|(>)|(=)|(<=)|(>=)|(like)] '.*' and
Date [<|(>)|(=)|(<=)|(>=)|(!=)|(like)] curdate() and Date [<|(>)|(=)|(<=)|(>=)
|(!=)|(like)] date_sub(curdate(), interval '.*' month)

2. Select * from defect where Quantity (<|(>)|(=)|(<=)|(>=)|(like)) '.*' and
Date (<|(>)|(=)|(<=)|(>=)|(!=)|(like)) curdate() and Date (<|(>)|(=)|(<=)|(>=)
|(!=)|(like)) date_sub(curdate(), interval '.*' month)

更新需要指导我的模式与输入字符串不匹配的原因。可能是什么错误?

2 个答案:

答案 0 :(得分:2)

还有更多问题:您使用的方括号不正确:

[<|(>)|(=)|(<=)|(>=)|(like)]

表示“以下一个字符:<>()|=eikl”。

使用括号代替括号,明智地分组:

([<>=]|[<>]=|like)

此外,您应该更具体:使用'[^']*'代替'.*'

最后,如果要匹配文字括号,则需要在正则表达式中对其进行转义:

date_sub\(curdate\(\), interval '[^']*' month\)

答案 1 :(得分:1)

我找到了解决方案

我的模式1没问题,只是我必须在'*'之前加上一个反斜杠,因为它在正则表达式中具有特殊含义。反斜杠使其成为普通字符

Select \* from defect where Quantity [<|(>)|(=)|(<=)|(>=)|(like)] '.*' and
Date [<|(>)|(=)|(<=)|(>=)|(!=)|(like)] curdate() and Date [<|(>)|(=)|(<=)|(>=)
|(!=)|(like)] date_sub(curdate(), interval '.*' month)

这是一个简单的问题。我已经知道了这条规则,但可以在下班后解决。

更正用括号[]替换方括号(),并在常量括号\(\)

之前放置反斜杠
Select \* from defect where Quantity (<|(>)|(=)|(<=)|(>=)|(like)) '.*' and
Date (<|(>)|(=)|(<=)|(>=)|(!=)|(like)) curdate\(\) and Date (<|(>)|(=)|(<=)|(>=)
|(!=)|(like)) date_sub\(curdate\(\), interval '.*' month\)