正则表达式不适用于以下模式

时间:2013-11-12 21:48:00

标签: java regex

我试图找出一个与查询参数中的以下条件匹配的正则表达式。我需要查找文本是否在查询参数中传递了andor运算符。我可以使用http:$URL/$RESOURCE?$filter="firstName eq 'John' and tenantId eq '32323232'"&$order="asc.

这样的URI

文字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,因为这里有一个值。值应始终使用引号,因此引号中的任何andor值都应由正则表达式加入。任何有助于过滤掉文本3等案例的帮助都应该受到赞赏。感谢

public static boolean hasANDorORoperator(String filter) {
    return filter.matches("^(.*?)\\s+(?i)(or|and)\\s+(.*?)$");
}

3 个答案:

答案 0 :(得分:3)

(and|or)(?=(?:[^']*'[^']*')*[^']*$)
如果跟随偶数引号,

将仅匹配andor。因此,如果您在字符串中,则不满足该条件且匹配失败。

See it on regex101

<强>说明:

(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 '