我试图找出一个与查询参数中的以下条件匹配的正则表达式。我需要查找文本是否在查询参数中传递了and
或or
运算符。我可以使用http:$URL/$RESOURCE?$filter="firstName eq 'John' and tenantId eq '32323232'"&$order="asc.
文字1:firstName eq 'John' and tenantId eq '32323232'
文字2:firstName like 'J%' or companyName eq 'IBM'
文字3:companyName like 'John and Sons'
虽然以下正则表达式模式适用于文本1和文本2,但是我需要一种方法来过滤掉文本3,因为这里有一个值。值应始终使用引号,因此引号中的任何and
或or
值都应由正则表达式加入。任何有助于过滤掉文本3等案例的帮助都应该受到赞赏。感谢
public static boolean hasANDorORoperator(String filter) {
return filter.matches("^(.*?)\\s+(?i)(or|and)\\s+(.*?)$");
}
答案 0 :(得分:3)
(and|or)(?=(?:[^']*'[^']*')*[^']*$)
如果跟随偶数引号,将仅匹配and
或or
。因此,如果您在字符串中,则不满足该条件且匹配失败。
<强>说明:强>
(and|or) # Match and/or.
(?= # only if the following can be matched here:
(?: # Start of non-capturing group:
[^']*' # Match any number of non-quote characters plus a quote
[^']*' # twice in a row.
)* # Repeat any number of times, including zero.
[^']* # Match any remaining non-quote characters
$ # until the end of the string.
) # End of lookahead assertion.
答案 1 :(得分:1)
如果我是你,我会首先提取所有字符串,就像在Text 3的例子中一样。我先过滤掉'John and Sons'。
然后,您只能使用可以与(。*)\ s +(和|或)\ s +(。*)正则表达式匹配的原始命令。
然后你不必处理由此产生的复杂正则表达式。
答案 2 :(得分:0)
/^((.*)('[^']')?)*(and|or)[^']*$/i
应该做的伎俩。我在匹配结束之前捕获任何内部的任何内容,或者,因此它不应该是结束/或者可能的匹配。因为大多数正则表达式引擎回溯以匹配以后的捕获组,所以我在最后包含了no '
。