【问题标题】:Java Regex - Capturing everything outside quotesJava Regex - 捕获引号之外的所有内容
【发布时间】:2017-06-11 10:23:01
【问题描述】:

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

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

例如,在这个字符串中:

这应该被捕获“not this”和“not \"this\" either”。

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

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

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

【问题讨论】:

  • 试试List[] res = s.split("\\s*\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"\\s*");
  • 这很好用,非常感谢!我将尝试了解正则表达式的工作原理,并将其应用于已注释的源代码(例如 /* /、/* **/ 和 // \n)。
  • 向我们展示您的实际 Java 代码 -- 理想情况下也是失败的测试方法。
  • 请注意,/*...*/ 的正则表达式类似于 Java 中的 cmets 是 posted by me here

标签: java regex quotes matcher


【解决方案1】:

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

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+ 个空格

【讨论】:

  • 谢谢,这正是我想要的!它帮助我更好地理解语法,我现在可以尝试为我需要的剩余步骤构建自己的语法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-26
  • 1970-01-01
  • 2013-11-15
  • 2012-11-06
相关资源
最近更新 更多