有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用高级正则表达式在java中拆分字符串

我尝试在java中使用字符串拆分,在子字符串之间拆分整个文档 制表符是空格和换行符,但我想排除引号之间存在单词的情况

例如:

这个文件

CATEGORYTYPE1
{
    CATEGORYSUBTYPE1
    {
        OPTION1 “ABcd efg1234”
        OPTION2 ABCdefg12345
        OPTION3 15
    }
    CATEGORYSUBTYPE2
    {
        OPTION1 “Blah Blah 123”
        OPTION2 Blah
        OPTION3 10
        OPTION4 "Blah"
    }
}

拆分到这些子字符串(如Eclipse调试器中所示):

[CATEGORYTYPE1, {, CATEGORYTYPE1, {, OPTION1, “ABcd, efg1234”, OPTION2....

当我使用当前正则表达式时,如下所示:

    String regex = "([\\n\\r\\s\\t]+)";

    String[] tokens = data.split(regex);

但我想实现的是这样分割它:

[CATEGORYTYPE1, {, CATEGORYTYPE1, {, OPTION1, “ABcd efg1234”, OPTION2....

(不在引号之间拆分内容)

正则表达式可以这样做吗?如何实现


共 (3) 个答案

  1. # 1 楼答案

    在这里使用拆分似乎比较复杂,甚至不够,使用查找更容易,请尝试以下方法:

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class Main {
        public static void main(String[] argv) {
    
            List<String> result = new ArrayList<String>();
    
            Pattern pattern = Pattern.compile("\"[^\"]+\"|\\S+");
            Matcher m = pattern.matcher(yourstring);
    
            while (matcher.find()) {
                result.add(m.group(0));
            }
        }
    }
    

    如果需要添加其他类型的引号(例如:“xxxxx xxxxx”),可以轻松地将它们添加到模式中:

    Pattern pattern = Pattern.compile("“[^”]+”|\"[^\"]+\"|\\S+");
    

    您可以通过以下方式允许转义双引号("xxx \"xxx\""):

    Pattern pattern = Pattern.compile("\"(?:[^\"]+|(?<!\\)\")+\"|\\S+");
    
  2. # 2 楼答案

    我知道我很晚才入党,但如果你也在寻找一个花哨的正则表达式来“理解”逃逸",这个应该适合你:

    Pattern p = Pattern.compile("(\\S*?\".*?(?<!\\\\)\")+\\S*|\\S+");
    Matcher m = p.matcher(str);
    while (m.find()) { ... }
    

    它还将解析如下内容:
    ab "cd \"ef\" gh" ij "kl \"no pq\"\" rs"
    致:
    ab"cd \"ef\" gh"ij"kl \"no pq\"\" rs"(不要被奇数个转义引号(\")弄糊涂)

    (可能是无关的),但是这个词也会在字符串的中间“理解”^ {CD1>},所以它将解析这个:^ {}::^ {< CD3>},^ {< CD11>},^ {CD12>} -而不是这样的模式很可能出现。p>

    无论如何,你也可以看看这个short demo

  3. # 3 楼答案

    以下是一种方法:

    str = "CATEGORYTYPE1\n" + 
    "{\n" + 
    "    CATEGORYSUBTYPE1\n" + 
    "    {\n" + 
    "        OPTION1 \"ABcd efg1234\"\n" + 
    "        OPTION2 ABCdefg12345\n" + 
    "        OPTION3 15\n" + 
    "    }\n" + 
    "    CATEGORYSUBTYPE2\n" + 
    "    {\n" + 
    "        OPTION1 \"Blah Blah 123\"\n" + 
    "        OPTION2 Blah\n" + 
    "        OPTION3 10\n" + 
    "        OPTION4 \"Blah\"\n" + 
    "    }\n" + 
    "}\n";
    
    String[] arr = str.split("(?s)(?=(([^\"]+\"){2})*[^\"]*$)\\s+");
    System.out.println(Arrays.toString(arr));
    
    // OUTPUT
    [CATEGORYTYPE1, {, CATEGORYSUBTYPE1, {, OPTION1, "ABcd efg1234", OPTION2, ABCdefg12345, ...
    

    解释:表示匹配空格或新行(\s),后跟偶数双引号(")。因此,两个双引号字符之间的\s将不会在拆分中使用,外部字符将被匹配(因为这些字符后面是偶数个双引号字符)