gpt4 book ai didi

java - 拆分嵌套字符串保留引号

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:09:22 24 4
gpt4 key购买 nike

我正在用 Java 开发一个需要嵌套字符串的项目。

对于纯文本形式的输入字符串如下所示:

This is "a string" and this is "a \"nested\" string"

结果必须如下:

[0] This
[1] is
[2] "a string"
[3] and
[4] this
[5] is
[6] "a \"nested\" string"

请注意,我希望保留 \" 序列。
我有以下方法:

public static String[] splitKeepingQuotationMarks(String s);

并且我需要根据给定的规则从给定的 s 参数中创建一个字符串数组,而不使用 Java 集合框架 或其衍生物。

我不确定如何解决这个问题。
可以制作一个正则表达式来解决这个问题吗?

根据评论中的问题更新:

  • 每个未转义的 " 都有其结束的未转义的 "(它们是平衡的)
  • 每个转义字符 \ 如果我们想创建表示它的文字(要创建表示 \ 的文本,我们需要将其写为 \\).

最佳答案

您可以使用以下正则表达式:

"[^"\\]*(?:\\.[^"\\]*)*"|\S+

参见 regex demo

Java demo :

String str = "This is \"a string\" and this is \"a \\\"nested\\\" string\""; 
Pattern ptrn = Pattern.compile("\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"|\\S+");
Matcher matcher = ptrn.matcher(str);
while (matcher.find()) {
System.out.println(matcher.group(0));
}

解释:

  • "[^"\\]*(?:\\.[^"\\]*)*" - 双引号后跟任何 0+ 个字符,"\ ([^"\\]) 后跟任何转义序列的 0+ 序列 (\\.) 后跟除 "\
  • 之外的任何 0+ 个字符
  • | - 或者...
  • \S+ - 1 个或多个非空白字符

注意

@Pshemo's suggestion - "\"(?:\\\\.|[^\"])*\"|\\S+"(或 "\"(?:\\\\.|[^\"\\\\])*\"|\\S+" 会更正确)- 是相同的表达式,但效率要低得多,因为它使用的是用 * 量化的交替组。这种结构涉及更多的回溯,因为正则表达式引擎必须测试每个位置,并且每个位置有 2 个概率。我的 unroll-the-loop 的版本将立即匹配文本 block ,因此速度更快且更可靠。

更新

由于 String[] 类型需要作为输出,您需要分两步完成:计算匹配项,创建数组,然后再次重新运行匹配器:

int cnt = 0;
String str = "This is \"a string\" and this is \"a \\\"nested\\\" string\"";
Pattern ptrn = Pattern.compile("\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"|\\S+");
Matcher matcher = ptrn.matcher(str);
while (matcher.find()) {
cnt++;
}
System.out.println(cnt);
String[] result = new String[cnt];
matcher.reset();
int idx = 0;
while (matcher.find()) {
result[idx] = matcher.group(0);
idx++;
}
System.out.println(Arrays.toString(result));

参见 another IDEONE demo

关于java - 拆分嵌套字符串保留引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36292591/

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