首页 > 解决方案 > 正则表达式拆分字符串并在双引号内保留内容

问题描述

是的,我知道这已经被问了很多,但是我没有找到解决方案来解决我正在尝试做的事情。所以请允许我解释一下我的问题是什么。

我需要找到一种方法,以便基于 ',' 、 '.'、空格和引号之间对字符串进行标记,而不在引号之间应用其他正则表达式规则。

允许此“[]”代表这些示例的单个空格。

假设我有一个这样的字符串:

ADD[]r2,[]r3

现在使用这样的正则表达式:

((?<=\s)|(?=\s+))|((?<=,))|(?=\.)

我可以像这样拆分字符串:

1: ADD
2: []
3: r2,
4: []
5: r3

这就是我要的。

现在假设我有一个这样的字符串:

"ADD[]r2,[]r3"[]"foo[]bar"

现在使用这样的正则表达式:

(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)

我可以像这样拆分字符串:

1: "ADD[]r2,[]r3"
2: []
3: "foo[]bar"

但如果我有这样的字符串:

ADD[]r2,[]r3[]"ADD[]r2,[]r3"

并使用了这样的正则表达式:

(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)((?<=\s)|(?=\s+))|((?<=,))|(?=\.)

我最终会得到这样的结果:

1:ADD
2:[]
3:r2,
4:[]
5:r3
6:[]
7:"Add[]r2,
8:[] r3"

但我想要的是这样的:

1:ADD
2:[]
3:r2,
4:[]
5:r3
6:[]
7:"Add[]r2,[]r3"

是否可以使用正则表达式来做到这一点?还是我需要做一些更复杂的事情?我要做的基本上是制作一个正则表达式来拆分代码语法。我只需要一种方法来分割一条线,就像我描述的那样。

任何帮助或建议将不胜感激。

编辑:我正在尝试做的示例驱动代码

 String line = "ADD r2, r3 \"ADD r2, r3\"";
        String[] arrLine = line.substring(0, line.length()).split("(?=(?:[^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)((?<=\\s)|(?=\\s+))|((?<=,))|(?=\\.)");

        for(int i = 0; i < arrLine.length; i++) {
            System.out.println(arrLine[i]);
        }

标签: javaregex

解决方案


除了使用拆分之外,您还可以匹配从开始到结束的双引号,或者匹配空白字符,或者匹配除空白和双引号之外的所有字符。

在 Java 中,您可以用于\h匹配水平空白字符,或用于\s匹配也可以匹配换行符的空白字符。

"[^"]*"|\h+|[^\h"]+

正则表达式演示| Java 演示

在 Java 中

String regex = "\"[^\"]*\"|\\h+|[^\\h\"]+";
String string = "ADD r2, r3 \"ADD r2, r3\"";

Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println(matcher.group(0));
}

输出

ADD
 
r2,
 
r3
 
"ADD r2, r3"

推荐阅读