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

Java 正则表达式不适用于以下模式,java,regex,Java,Regex,我试图在查询参数中找出一个与以下条件匹配的正则表达式。我需要找出文本是否在查询参数中传递了and或or运算符。我可以有一个类似http:$URL/$RESOURCE?$filter=firstName eq'John'和tenantId eq'32323232'&$order=asc的URI 正文1:名eq‘John’和tenantId eq‘32323232’ 文本2:名如“J%”或公司名eq“IBM” 课文3:公司名称如“约翰和儿子” 虽然下面的正则表达式模式适用于文本1和文本2,但是我需要

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

正文1:名eq‘John’和tenantId eq‘32323232’ 文本2:名如“J%”或公司名eq“IBM” 课文3:公司名称如“约翰和儿子”

虽然下面的正则表达式模式适用于文本1和文本2,但是我需要一种过滤文本3的方法,因为and here包含在一个值中。值应始终在引号中,因此引号中的任何and或or值应由正则表达式输入。如有助于过滤文本3等情况,将不胜感激。谢谢

public static boolean hasANDorORoperator(String filter) {
    return filter.matches("^(.*?)\\s+(?i)(or|and)\\s+(.*?)$");
}
将仅在后面有偶数个引号时匹配and或or。因此,如果在字符串中,则不满足该条件,匹配失败

说明:

将仅在后面有偶数个引号时匹配and或or。因此,如果在字符串中,则不满足该条件,匹配失败

说明:

我们应该做到这一点。在匹配结束/或之前,我正在捕获妄想症中的任何东西,因此它不可能再匹配结束/或了。因为大多数regexp引擎都会回溯以匹配后来捕获的组,所以我在末尾添加了no


我们应该做到这一点。在匹配结束/或之前,我正在捕获妄想症中的任何东西,因此它不可能再匹配结束/或了。因为大多数regexp引擎都会回溯以匹配后来捕获的组,所以我在末尾添加了“否”。

如果我是你,我会首先拉出所有字符串,如文本3的示例中所示。我先过滤掉《约翰和儿子》

然后,只剩下可以与.\s+和|或\s+.*正则表达式匹配的原始命令


这样,您就不必处理由此产生的复杂正则表达式。

如果我是您,我会首先取出所有字符串,如文本3的示例中所示。我先过滤掉《约翰和儿子》

然后,只剩下可以与.\s+和|或\s+.*正则表达式匹配的原始命令


这样,您就不必处理由此产生的复杂正则表达式。

tenantId只是键值对中的一个键。@Flimzy:没关系,是吗?@Daemon:这是一个修饰符,只应用于该捕获组。您希望文本中有转义引号吗?欢迎使用堆栈溢出。请尽快阅读这一页。对于正则表达式问题,通常有必要确定您将正则表达式嵌入哪种语言?在我看来,它像Java或C,但在两种语言中都不熟练。tenantId只是键值对中的一个键。@Flimzy:没什么关系,是吗?@Daemon:这是一个只应用于捕获组的修饰符。您希望文本中有转义引号吗?欢迎使用堆栈溢出。请尽快阅读这一页。对于正则表达式问题,通常有必要确定您将正则表达式嵌入哪种语言?在我看来,它看起来像Java或C,但两种语言都不熟练。+1你比我强!虽然我更喜欢{2}而不是重复非引号/引号序列+1感谢链接,这是一个非常有用的在线正则表达式检查工具!虽然我更喜欢{2}而不是重复非引号/引号序列+1,但感谢链接,这是一个非常有用的在线正则表达式检查工具。单引号',而不是双引号。单引号',而不是双引号。
(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.
/^((.*)('[^']')?)*(and|or)[^']*$/i