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

Java Regex - Capturing everything outside quotes

提问人:Beerbossa 提问时间:1/26/2017 最后编辑:VLAZBeerbossa 更新时间:8/27/2023 访问量:439

问:

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

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

例如,在此字符串中:

这应该被捕获为“不是这个”和“也不是”这个”。

我应该能够使用模式和匹配器找到“这应该被捕获”、“和”、“.”。

我目前拥有的是\“[^\”]+\“|([^\“]+),如果文档中有一对相等的 ”“,则效果很好,但一旦有转义的 ”“ 就会中断。

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

Java 正则表达 式行情

评论

0赞 Wiktor Stribiżew 1/26/2017
尝试List[] res = s.split("\\s*\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"\\s*");
0赞 Wiktor Stribiżew 1/26/2017
请参见 ideone.com/NgMozq
0赞 Beerbossa 1/27/2017
这很好用,非常感谢!我将尝试了解正则表达式的工作原理,并将其应用于注释的源代码(例如 /* /、/* **/ 和 // \n)。
0赞 slim 1/27/2017
向我们展示您的实际 Java 代码 -- 理想情况下,也是一个失败的测试方法。
0赞 Wiktor Stribiżew 1/27/2017
请注意,Java 中类似注释的正则表达式是我在这里发布的/*...*/

答:

2赞 Wiktor Stribiżew 1/27/2017 #1

似乎对于您当前的任务,您可以使用一种模式来匹配双引号字符串文字来拆分字符串:

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

评论

0赞 Beerbossa 1/27/2017
谢谢,这绝对是我想要的!它帮助我更好地理解语法,我现在可以尝试为我需要的其余步骤构建自己的语法。
0赞 Ela Singh 11/7/2022 #2
String s = "This should be captured \"not this\" and \"not \\\"this\\\" either\".";
String[] res = s.split("\"([^\"]*)\"");
System.out.println(Arrays.toString(res));

这是一个相对较短的正则表达式模式匹配表达式。