Java 正则表达式 - 捕获引号外的所有内容

Java Regex - Capturing everything outside quotes

TLDR:我希望捕获引号之外的所有内容,但在 Java 中我似乎无法使用此正则表达式 \"|"(?:\" |[^"])*"|([^\"]+) 而它适用于 http://myregexp.com/ 等网站。谁能指出我做错了什么?

你好,我目前正在尝试分析 .java 源代码并将引号外的所有内容提取为字符串(忽略转义引号)。

例如,在这个字符串中:

This should be captured "not this" and "not \"this\" either".

我应该能够使用模式和匹配器找到 "This should be captured"、"and"、“.”。

我目前拥有的是 \"[^\"]+\"|([^\"]+),如果有一对相等的"" 在文档中,但一旦出现转义就会中断。

在在线正则表达式测试器上,我尝试了 \"|"(?:\"|[^"])*"|([^\"]+) 哪个似乎完全符合我的要求,但是当我在 Java 中尝试时却没有。

看来对于您当前的任务,您可以使用一种模式将双引号字符串文字与 split 字符串相匹配:

List[] res = s.split("\s*\"[^\"\\]*(?:\\.[^\"\\]*)*\"\s*");

参见 Java demo:

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+ 个字符
  • (?:\\.[^\"\\]*)* - 0+ 个序列:
    • \\. - \ 和换行符以外的任何字符
    • [^\"\\]* - "\
    • 以外的 0+ 个字符
  • \"\s* - 一个 " 和 0+ 个空格