正则处理字符串分词:如何仅分割双引号外的多字符运算符?
解决双引号外指定多/单字符符号的分词问题
你的问题根源在于原正则使用了字符集[],它会把所有内容拆成单个字符匹配,导致原本要作为整体匹配的||、<=等被拆成单个|、<,进而错误分割了这些单字符。我们需要优先匹配多字符分隔符,再匹配单字符,同时确保只在双引号外分割。
修正后的正则与代码
核心是用**非捕获组(?:...)**按长度从长到短列出所有要匹配的分隔符,保证长分隔符先被匹配,再配合正向预查排除双引号内的内容:
public class TokenizerExample { public static void main(String[] args) { String line1= "sa2dvf=s||a|df&&v<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&&v<gdsf ds!gv fdgv"fvdsvg=kjhbhbj=="
正则解释
(?:==|<=|>=|!=|\|\||\+|=|\{|\}):非捕获组,按长度从长到短列出所有目标分隔符,确保||不会被拆成两个|单独匹配,<=不会被拆成<和=;(?=(?:[^"]*"[^"]*")*[^"]*$):正向预查,验证当前位置之后的双引号是偶数个(即当前分隔符不在双引号内部)。
内容的提问来源于stack exchange,提问作者Samridhi
相关产品推荐
相关产品推荐

