如何用正则匹配引号内内容及非AND/OR的单词(含word5AND类)
正则表达式修复方案
需求说明
目标输入文本:word1 AND word2 AND 'word3 word4' OR word5AND OR 'word6 OR word7'
需要匹配两类内容:
- 单引号或双引号包裹的任意内容
- 非独立存在的
AND/OR的单词(如word5AND这类包含AND但并非单独作为一个词的内容)
期望匹配结果:word1、word2、word3 word4、word5AND、word6 OR word7
原正则问题分析
原正则(["'])(?:(?=(\?))\2.)*?\1|(\b\w*[-']\w*\b)|(\w*)\b(?:(?!AND|OR)\w)+\b无法匹配word5AND,原因是最后一段规则要求单词末尾必须包含非AND/OR的字符,而word5AND结尾为AND,不符合该限制条件。
修复后的正则表达式
(['"])(?:\\?.)*?\1|\b(?!(AND|OR)\b)\w+\b
规则解释
- 引号内容匹配:
(['"])(?:\\?.)*?\1- 匹配单引号或双引号包裹的内容,支持转义引号(如
'it\'s a test'这类场景),如果不需要支持转义引号,可简化为(['"]).*?\1
- 匹配单引号或双引号包裹的内容,支持转义引号(如
- 非独立AND/OR单词匹配:
\b(?!(AND|OR)\b)\w+\b- 通过负向预查排除单独的
AND或OR单词,同时匹配所有包含AND/OR但整体为一个词的内容(如word5AND),以及普通单词(如word1、word2)
- 通过负向预查排除单独的
结合replaceAll的使用示例(Java环境)
如果需要通过replaceAll过滤掉不需要的内容(单独的AND/OR及冗余空格),可使用以下方式:
String input = "word1 AND word2 AND 'word3 word4' OR word5AND OR 'word6 OR word7'"; // 匹配并替换单独的AND/OR以及它们周围的多余空格 String filtered = input.replaceAll("\\b(AND|OR)\\b|\\s+(?=(?:['\"]|\\b(?!AND|OR)\\w+\\b))", ""); // 输出结果:word1word2'word3 word4'word5AND'word6 OR word7'
如果需要提取所有匹配项,更推荐使用Matcher循环查找:
import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexTest { public static void main(String[] args) { String input = "word1 AND word2 AND 'word3 word4' OR word5AND OR 'word6 OR word7'"; Pattern pattern = Pattern.compile("(['\"])(?:\\\\?.)*?\\1|\\b(?!(AND|OR)\\b)\\w+\\b"); Matcher matcher = pattern.matcher(input); List<String> results = new ArrayList<>(); while (matcher.find()) { results.add(matcher.group()); } // results内容:["word1", "word2", "'word3 word4'", "word5AND", "'word6 OR word7'"] } }
内容的提问来源于stack exchange,提问作者MWB
相关产品推荐
相关产品推荐

