Java Regex - 捕获引号之外的所有内容

问题描述 投票:0回答:2

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

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

例如,在这个字符串中:

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

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

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

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

java regex quotes
2个回答
2
投票

对于您当前的任务来说,您可以使用一种模式来匹配双引号字符串文字来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+ 个字符
  • (?:\\\\.[^\"\\\\]*)*
    - 0+ 个序列:
    • \\\\.
      -
      \
      和除换行符之外的任何字符
    • [^\"\\\\]*
      - 除
      "
      \
    • 之外的 0+ 个字符
  • \"\\s*
    - 一个
    "
    和 0+ 个空格

0
投票
String s = "This should be captured \"not this\" and \"not \\\"this\\\" either\".";
String[] res = s.split("\"([^\"]*)\"");
System.out.println(Arrays.toString(res));

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

© www.soinside.com 2019 - 2024. All rights reserved.