【问题标题】:Regex line by line: How to match triple quotes but not double quotes正则表达式逐行:如何匹配三引号而不是双引号
【发布时间】:2010-12-02 11:15:46
【问题描述】:

我需要检查一个包含很多单词/字母/等的字符串,是否只包含一组三重双引号(即“””),但也可以包含单双引号(“)和双双引号-quotes (""),使用正则表达式。到目前为止还没有取得太大的成功。

【问题讨论】:

    标签: regex string double quotes


    【解决方案1】:

    这对你来说可能是一个好的开始。

    ^(\"([^\"\n\\]|\\[abfnrtv?\"'\\0-7]|\\x[0-9a-fA-F])*\"|'([^'\n\\]|\\[abfnrtv?\"'\\0-7]|\\x[0-9a-fA-F])*'|\"\"\"((?!\"\"\")[^\\]|\\[abfnrtv?\"'\\0-7]|\\x[0-9a-fA-F])*\"\"\")$
    

    regex101.com查看它的实际应用。

    【讨论】:

      【解决方案2】:

      负前瞻的正则表达式可以做到这一点:

      (?!.*"{3}.*"{3}).*"{3}.*
      

      我用这几行java代码试了一下:

      String good = "hello \"\"\" hello \"\" hello ";
      String bad = "hello \"\"\" hello \"\"\" hello ";
      String regex = "(?!.*\"{3}.*\"{3}).*\"{3}.*";
      System.out.println( good.matches( regex ) );
      System.out.println( bad.matches( regex ) );
      

      ...带输出:

      true
      false
      

      【讨论】:

      • 这是完美的,谢谢!我假设您将负前瞻部分放在首位,以确保在匹配之前没有 2 个三重双引号实例?
      【解决方案3】:

      可能有很多方法可以做到这一点,但一种简单的方法是仅查找多次出现的三引号,然后反转正则表达式。下面是 Perl 的一个例子:

      use strict;
      use warnings;
      
      my $match = 'hello """ hello "" hello';
      my $no_match = 'hello """ hello """ hello';
      my $regex = '[\"]{3}.*?[\"]{3}';
      
      if ($match !~ /$regex/) {
          print "Matched as it should!\n";
      }
      if ($no_match !~ /$regex/) {
          print "You shouldn't see this!\n";
      }
      

      哪些输出:

      Matched as it should!
      

      基本上,您是在告诉它找到您不想要的东西,然后颠倒事实。希望这是有道理的。如果您需要帮助,可以帮助您将示例转换为另一种语言。

      【讨论】:

      • 另外,为了处理四重引号的情况,您可能希望按照 Brabster 的建议修改正则表达式,即 [^"][\"]{3}[^" ],从而使最终的正则表达式(反转)"[^"][\"]{3}[^"].*?[^"][\"]{3}[^"]"
      【解决方案4】:

      尝试使用出现次数运算符来精确匹配三个双引号。

      • \"{3}
      • ["]{3}
      • [\"]{3}

      我使用http://www.regextester.com/ 快速检查过,似乎工作正常。

      不过,您使用所选语言正确编译正则表达式的方式可能会有所不同!

      【讨论】:

      • 谢谢,但它周围会有其他词/双双引号等的可能性。
      • 同意。我只是不知道该怎么做。
      • 是的,在想。这更接近... [^"][\"]{3}[^"] (不是 d-quote,然后是 3 d-quote,然后是不是 d-quote 的 char)
      • 嗯,是的。一个好的测试字符串应该是: match: (hello """ hello "" hello) no match: (hello """ hello """ hello)
      • 我似乎无法用正则表达式表达这一点,但不知道为什么。感觉就像我应该能够获得一个正则表达式来匹配“三个 d-quote,下一个 char 不是 d-quote(可以做到这一点)并且不再是相同的模式”。很好奇,会继续寻找,但如果你需要这个,我会说开始研究算法可能匹配并删除第一批 3 d-quotes,然后检查另外三个。
      【解决方案5】:

      取决于您的语言,但您应该只需要匹配三个双引号(例如,/\"{3}/),然后计算匹配项以查看是否正好有一个。

      【讨论】:

      • 我想过,我只是希望能够以更简洁的方式/尽可能少的代码来完成它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-15
      • 1970-01-01
      相关资源
      最近更新 更多