为自定义搜索引擎编写匹配AND/OR/NOT的正则表达式求助
解决方案:匹配布尔搜索表达式的正则
针对你自定义搜索引擎的正则需求,下面是能匹配所有合法示例、排除非法输入的正则方案:
正确的正则表达式
val pattern = Pattern.compile("^(NOT\\s+)?'(?!(AND|OR|NOT)$)(?!.*\\b(AND|OR|NOT)\\b)[^']*'(?:\\s+(AND|OR)\\s+(NOT\\s+)?'(?!(AND|OR|NOT)$)(?!.*\\b(AND|OR|NOT)\\b)[^']*')*$")
正则各部分解释
^和$:锚定字符串首尾,确保整个输入完全匹配,避免部分匹配的情况。(NOT\\s+)?:匹配可选的NOT前缀,要求NOT后至少跟一个空格。'(?!(AND|OR|NOT)$)(?!.*\\b(AND|OR|NOT)\\b)[^']*':匹配合法的带引号值:(?!(AND|OR|NOT)$):排除引号内仅为AND/OR/NOT的情况。(?!.*\\b(AND|OR|NOT)\\b):排除引号内包含完整AND/OR/NOT单词的情况(比如'testANDtest')。[^']*:匹配引号内除单引号外的任意字符。
(?:\\s+(AND|OR)\\s+(NOT\\s+)?'(?!(AND|OR|NOT)$)(?!.*\\b(AND|OR|NOT)\\b)[^']*')*:匹配重复的连接项:\\s+(AND|OR)\\s+:匹配AND/OR操作符,要求前后至少有一个空格。- 后续重复可选的
NOT前缀+合法带引号值的结构,支持多个连接项。
验证说明
该正则可完全匹配你提供的examples列表中所有合法情况,同时排除examplesNotMatched中的所有非法输入:
- 支持单个带引号值(如
'value')、带NOT前缀的单个值(如NOT 'value')。 - 支持通过
AND/OR连接的多值组合(如'value' AND NOT 'value1'、'value' OR 'value1' AND NOT 'value2')。 - 自动排除无引号值、直接以
AND/OR开头的输入、缺少操作符的多值组合、引号内包含关键词的情况等。
内容的提问来源于stack exchange,提问作者J.Doe
相关产品推荐
相关产品推荐

