2

我正在尝试找出与查询参数中的以下条件匹配的正则表达式。我需要查找文本是否在查询参数中传递了andor运算符。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 here 位于一个值中。值应始终在引号中,因此引号中的任何andor值都应由正则表达式输入。任何有助于过滤掉文本 3 等案例的帮助都将不胜感激。谢谢

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

3 回答 3

3
(and|or)(?=(?:[^']*'[^']*')*[^']*$)

只有偶数个引号and才会匹配。or因此,如果您在字符串中,则不满足该条件并且匹配失败。

在 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.
于 2013-11-12T21:58:21.867 回答
1

如果我是你,我会先拉出所有的字符串,就像在文本 3 的示例中一样。我首先会过滤掉“John and Sons”。

然后,您将只剩下可以与 (.*)\s+(and|or)\s+(.*) 正则表达式匹配的原始命令。

这样您就不必处理生成的复杂正则表达式。

于 2013-11-12T22:11:47.600 回答
0
/^((.*)('[^']')?)*(and|or)[^']*$/i

应该做的伎俩。在匹配结束/或之前,我正在捕获括号内的任何内容,因此它不应该成为结束/或的可能匹配项。因为大多数正则表达式引擎会回溯以匹配后来的捕获组,所以我no '在最后包括了。

于 2013-11-12T21:59:54.640 回答