You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用正则匹配引号内内容及非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. 引号内容匹配:(['"])(?:\\?.)*?\1
    • 匹配单引号或双引号包裹的内容,支持转义引号(如'it\'s a test'这类场景),如果不需要支持转义引号,可简化为(['"]).*?\1
  2. 非独立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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 03:05:20