当前位置: 首页 > 面试题库 >

拆分嵌套的字符串并保留引号

符国安
2023-03-14
问题内容

我正在Java中的一个需要嵌套字符串的项目中工作。

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

这是“字符串”,这是“ \嵌套”字符串

结果必须为以下内容:

[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 Collection Framework 或其派生类。

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

根据评论中的问题进行更新

  • 每个未转义"的结尾"均未转义(它们是平衡的)
  • \如果我们要创建表示它的文字,则每个转义字符也必须转义(要创建表示\我们需要将其编写为的文本\\)。

问题答案:

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

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

参见正则表达式演示

Java演示:

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));
}

说明

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

注意

@ Pshemo的建议-"\"(?:\\\\.|[^\"])*\"|\\S+"(或"\"(?:\\\\.|[^\"\\\\])*\"|\\S+"会更正确的)-是相同的表达,但由于它是利用与量化的交替组的效率低得多*。由于正则表达式引擎必须测试每个位置,因此此构造涉及更多的回溯,每个位置有2个概率。我的基于_循环展开的_ 版本将一次匹配大量文本,因此更加快捷,可靠。

更新

由于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);
html" target="_blank">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));

观看另一个IDEONE演示



 类似资料:
  • 问题内容: 我有以下字符串(Java 1.5): 我需要一个数组: 用Java最方便的方法是什么? 问题答案: 这将为您提供所需的数组,只有第一项为空。和: 这将使数组没有空的第一项。 此处的关键是零宽度正向超前(非捕获构造)(请参阅regex pattern docs)。 表示“或者;或:” 是字边界的-在那里是为了不将第一个视为定界符(因为它是序列的开头)

  • 我有一个字符串 我想将加法与数字分开,以便我可以将其保留在其他字段中。如何在不丢失数字或加法的情况下拆分此值?最后,我想有 2 个具有以下类型的字段: 关于这个有很多问题,但是我找不到两个值都必须保存的问题。这就是为什么我创建了一个新问题。

  • 我有一个字符串: 我想用分隔符< code >分割这个字符串 为此,我使用以下方法: 我得到了我需要的东西,除了我失去了分隔符。下面是示例:http://jsfiddle.net/JwrZ6/1/ 如何保留分隔符?

  • 问题内容: 我有一个字符串: 我想用分隔符和一个特殊字符分隔此字符串。 为此,我正在使用: 如何保留定界符? 问题答案: 使用(正)前瞻,以便正则表达式断言特殊字符存在,但实际上并不与之匹配: 实际观看:

  • 我希望能够根据子字符串分隔符拆分字符串,在分隔符子字符串的第一个字符之前开始拆分。现在: 将给我,但我希望得到