【问题标题】:Regular expression for matching double-quote but not backslash-double-quote匹配双引号但不匹配反斜杠双引号的正则表达式
【发布时间】:2016-12-13 01:12:27
【问题描述】:

我需要正则表达式来匹配双引号字符"但如果它前面有反斜杠,即\",则不需要。

我到了[^\\]",但它选择了两个字符:" 和前面的任何字符(\ 除外),我只需要选择" 字符。

我需要从流中解析如下所示的行: command "string1" "string2" 字符串可以包含空格和转义的双引号。我需要拆分它,以便我得到命令、string1 和 string2 作为数组。

提前致谢

【问题讨论】:

  • 由于引号是 Java 字符串分隔符而反斜杠是正则表达式元字符,因此您的问题可能有多种解释。根据您的意思,我认为编辑得更清楚。如果这不正确,请恢复编辑。
  • 请注意,这真的闻起来像XY Problem。我猜您正在尝试解析可以包含转义双引号的双引号分隔字符串。由于语法不规则,因此正则表达式不是一个好主意。了解您真正想要完成的工作的背景会有所帮助。
  • 你说得对,我编辑了我的问题
  • 您的文本是否也可以包含\?如果是的话,这个\ 是否也应该像\" 一样用\\ 转义?如果是,那么您有潜在的问题,因为对于像c:\\path\\"foo\"bar" 这样的数据,第一个" 没有被转义,但在它之前已经转义了\\,只有第二个" 被转义。正则表达式在这里看起来不像是正确的工具,它看起来像是解析器的工作。

标签: java regex string


【解决方案1】:

您可以使用否定的后视:(?<!\\)"

(?<!reg1)reg2 表示reg2 必须以reg1 开头。请注意,reg1 不会被捕获。

现在在 Java 代码中,您的正则表达式看起来会略有不同,因为您需要转义双引号和两个反斜杠:

String regex = "(?<!\\\\)\"";

【讨论】:

    【解决方案2】:

    您可以为此使用negative lookbehind:匹配前面没有\\",例如:

    Pattern pat = Pattern.compile("(?<!\\\\)\"");
    
    System.out.println(pat.matcher("quote \" not escaped").find());
    // prints true, the " doesn't follow a \
    
    System.out.println(pat.matcher("quote \\\" escaped").find());
    // prints false, the " follows a \
    

    【讨论】:

      猜你喜欢
      • 2020-12-04
      • 1970-01-01
      • 2020-10-28
      • 2012-07-30
      • 1970-01-01
      • 1970-01-01
      • 2014-02-04
      • 1970-01-01
      相关资源
      最近更新 更多