我正在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/ 如何保留分隔符?
问题内容: 我有一个字符串: 我想用分隔符和一个特殊字符分隔此字符串。 为此,我正在使用: 如何保留定界符? 问题答案: 使用(正)前瞻,以便正则表达式断言特殊字符存在,但实际上并不与之匹配: 实际观看:
我希望能够根据子字符串分隔符拆分字符串,在分隔符子字符串的第一个字符之前开始拆分。现在: 将给我,但我希望得到