TLDR:我希望捕获引号之外的所有内容,但我似乎无法在 Java 中使用此正则表达式 \"|"(?:\"|[^"])*"|([^ \"]+),同时它可以在 http://myregexp.com/ 等网站上运行。谁能指出我做错了什么?
嗨,我目前正在尝试分析 .java 源代码并将引号之外的所有内容提取为字符串(忽略转义引号)。
例如,在这个字符串中:
这应该被捕获为“不是这个”和“也不是“这个””。
我应该能够使用模式和匹配器来找到“这应该被捕获”,“和”,“。”。
我目前拥有的是 \"[^\"]+\"|([^\"]+),如果文档中存在一对相等的“”,则效果很好,但一旦存在就会中断逃脱的。
在在线正则表达式测试仪上,我尝试了 \"|"(?:\"|[^"])*"|([^\"]+) 这似乎完全符合我的要求,但是当我在 Java 中尝试时,却没有。
对于您当前的任务来说,您可以使用一种模式来匹配双引号字符串文字来split字符串:
List[] res = s.split("\\s*\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"\\s*");
查看 Java 演示:
String s = "This should be captured \"not this\" and \"not \\\"this\\\" either\".";
String[] res = s.split("\\s*\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"\\s*");
System.out.println(Arrays.toString(res));
// => [This should be captured, and, .]
图案详情:
\\s*
- 0+ 个空格\"
- 双引号[^\"\\\\]*
- 除 "
和 \
(?:\\\\.[^\"\\\\]*)*
- 0+ 个序列:
\\\\.
- \
和除换行符之外的任何字符[^\"\\\\]*
- 除 "
和 \
\"\\s*
- 一个 "
和 0+ 个空格String s = "This should be captured \"not this\" and \"not \\\"this\\\" either\".";
String[] res = s.split("\"([^\"]*)\"");
System.out.println(Arrays.toString(res));
这是一个相对较短的正则表达式模式匹配表达式。