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

正则处理字符串分词:如何仅分割双引号外的多字符运算符?

解决双引号外指定多/单字符符号的分词问题

你的问题根源在于原正则使用了字符集[],它会把所有内容拆成单个字符匹配,导致原本要作为整体匹配的||、<=等被拆成单个|、<,进而错误分割了这些单字符。我们需要优先匹配多字符分隔符,再匹配单字符,同时确保只在双引号外分割。

修正后的正则与代码

核心是用**非捕获组(?:...)**按长度从长到短列出所有要匹配的分隔符,保证长分隔符先被匹配,再配合正向预查排除双引号内的内容:

public class TokenizerExample {
    public static void main(String[] args) {
        String line1= "sa2dvf=s||a|df&amp;&amp;v&lt;gdsf==ds!gv!=fdgv\"fvdsvg=kjhbhbj==\"";
        // 优先匹配多字符分隔符,再匹配单字符,正向预查确保不在引号内
        String regex = "(?:==|<=|>=|!=|\\|\\||\\+|=|\\{|\\})(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)";
        String[] tokens = line1.split(regex, -1);
        for(String val : tokens) { 
            System.out.println(val); 
        }
    }
}

输出结果验证

运行后会得到你期望的输出:

sa2dvf
s
a|df&amp;&amp;v&lt;gdsf
ds!gv
fdgv"fvdsvg=kjhbhbj=="

正则解释

  1. (?:==|<=|>=|!=|\|\||\+|=|\{|\}):非捕获组,按长度从长到短列出所有目标分隔符,确保||不会被拆成两个|单独匹配,<=不会被拆成<和=;
  2. (?=(?:[^"]*"[^"]*")*[^"]*$):正向预查,验证当前位置之后的双引号是偶数个(即当前分隔符不在双引号内部)。

内容的提问来源于stack exchange,提问作者Samridhi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:55:38