在Regex中需要帮助以排除“在”中的拆分字符串

时间:2013-08-13 06:23:38

标签: java regex

我需要将一个基于逗号的字符串拆分为分隔符,但是如果字符串的一部分包含“分裂必须从该部分开始停止”到它的结尾,即使它之间包含逗号。

任何人都可以帮助我使用正则表达式来解决这个问题。

2 个答案:

答案 0 :(得分:2)

重新提出这个问题,因为它有一个没有提到的简单正则表达式解决方案。这种情况听起来非常类似于[“正则表达式匹配模式,除非......”] [4]

\"[^\"]*\"|(,)

交替的左侧匹配完整的双引号字符串。我们将忽略这些匹配。右侧匹配并捕获第1组的逗号,我们知道它们是正确的,因为它们与左侧的表达式不匹配。

以下是工作代码(请参阅online demo):

import java.util.regex.*;
import java.util.List;

class Program {
    public static void main (String[] args) {

        String subject = "\"Messages,Hello\",World,Hobbies,Java\",Programming\"";
        Pattern regex = Pattern.compile("\"[^\"]*\"|(,)");
        Matcher m = regex.matcher(subject);
        StringBuffer b = new StringBuffer();
        while (m.find()) {
            if(m.group(1) != null) m.appendReplacement(b, "SplitHere");
            else m.appendReplacement(b, m.group(0));
        }
        m.appendTail(b);
        String replaced = b.toString();
        String[] splits = replaced.split("SplitHere");
        for (String split : splits)
            System.out.println(split);
    } // end main
} // end Program

参考

  1. How to match pattern except in situations s1, s2, s3

答案 1 :(得分:0)

请试试这个:


(?<!\G\s*"[^"]*),


如果你把这个正则表达式放在你的程序中,它应该是:

String regex = "(?<!\\G\\s*\"[^\"]*),";


但有两件事情并不清楚:

  1. "是否仅在,附近开始,还是可以在内容的中间开始,例如AAA, BB"CC,DD"?上面的正则表达式只处理start neer ,

  2. 如果内容本身有",如何逃避?使用""\"?上面的正则表达式不会处理任何转义"格式。