gpt4 book ai didi

java - java中基于空格和匹配引号的正则表达式分割字符串

转载 作者:行者123 更新时间:2023-12-01 18:34:56 24 4
gpt4 key购买 nike

我有一个字符串,需要根据空格和精确匹配的引号进行拆分。

如果

string = "It is fun \"to write\" regular\"expression"

拆分后我希望结果是:

有趣

“写”

常规

“表达式

我从中得到一些接近做到这一点的正则表达式是:

STRING_SPLIT_REGEXP = "[^\\s\"']+|\"([^\"]*)\"|'([^']*)'"

提前感谢您的回答。

最佳答案

看来您刚刚使用了 this answer 中的正则表达式,但正如您所看到的,它不使用 split 而是使用 Matcher 类中的 find 方法。此外,此答案还负责处理 ',其中您的输入没有显示任何迹象。

因此,您可以通过删除处理 ' 的部分来改进此正则表达式,这将使其看起来像

[^\\s\"]+|\"([^\"]*)\"

此外,由于您希望将 " 作为标记的一部分,因此您不需要将 " 之间的匹配放在单独的组中,因此请去掉括号\"([^\"]*)\" 部分

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

现在您需要做的就是添加没有结束 " 的情况,但您会得到字符串结尾。因此将此正则表达式更改为

[^\\s\"]+|\"[^\"]*(\"|$)

在此之后,您可以使用 Matcher,在某个地方查找所有存储 token ,比如说在List中。

示例:

String data = "It is fun \"to write\" regular\"expression";
List<String> matchList = new ArrayList<String>();
Pattern regex = Pattern.compile("[^\\s\"]+|\"[^\"]*(\"|$)");
Matcher regexMatcher = regex.matcher(data);
while (regexMatcher.find()) {
System.out.println(regexMatcher.group());
matchList.add(regexMatcher.group());
}

输出:

It
is
fun
"to write"
regular
"expression
<小时/>

处理此数据的更复杂的表达式可能如下所示

String data = "It is fun \"to write\" regular \"expression";
for(String s : data.split("(?<!\\G)(?<=\\G[^\"]*(\"[^\"]{0,100000}\")?[^\"]*)((?<=\"(?!\\s))|\\s+|(?=\"))"))
System.out.println(s);

但是这种方法比编写自己的解析器过于复杂。

<小时/>

这样的解析器可能看起来像

public static List<String> parse(String data) {
List<String> tokens = new ArrayList<String>();
StringBuilder sb = new StringBuilder();
boolean insideQuote = false;
char previous = '\0';

for (char ch : data.toCharArray()) {
if (ch == ' ' && !insideQuote) {
if (sb.length() > 0 && previous != '"')
addTokenAndResetBuilder(sb, tokens);
} else if (ch == '"') {
if (insideQuote) {
sb.append(ch);
addTokenAndResetBuilder(sb, tokens);
} else {
addTokenAndResetBuilder(sb, tokens);
sb.append(ch);
}
insideQuote = !insideQuote;
} else {
sb.append(ch);
}
previous = ch;
}
addTokenAndResetBuilder(sb, tokens);

return tokens;
}

private static void addTokenAndResetBuilder(StringBuilder sb, List<String> list) {
if (sb.length() > 0) {
list.add(sb.toString());
sb.delete(0, sb.length());
}
}

使用

String data = "It is fun \"to write\" regular\"expression\"xxx\"yyy";
for (String s : parse(data))
System.out.println(s);

关于java - java中基于空格和匹配引号的正则表达式分割字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22416318/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com