【问题标题】:How to exclude occurrence of a substring from a string using regex?如何使用正则表达式从字符串中排除子字符串的出现?
【发布时间】:2011-09-12 01:47:47
【问题描述】:

我有以下两种形式的字符串输入。

1.

<!--XYZdfdjf., 15456, hdfv.4002-->
<!DOCTYPE

2.

<!--XYZdfdjf., 15456, hdfv.4002
<!DOCTYPE

如果遇到表单 2 并且没有匹配表单 1,我想返回一个匹配项。 因此,基本上我想要一个正则表达式,它可以任意接受&lt;!--&lt;!DOCTYPE 之间的所有字符,除非在两者之间出现--&gt;

我正在使用 Pattern 、 Matcher 和 java 正则表达式。 在 Pattern.compile() 专用的正则表达式方面寻求帮助

提前致谢。

【问题讨论】:

    标签: java regex


    【解决方案1】:

    这似乎很容易通过使用String.contains() 解决:

    if (yourHtml.contains("-->")) {
        // exclude
    } else {
        // extract the content you need
        String content = 
            yourHtml.substring("<!--".length(), yourHtml.indexOf("<!DOCTYPE"));
    }
    

    我觉得你看得太远了。

    【讨论】:

    • 感谢您提供简单的解决方案,但我也在寻找正则表达式解决方案。
    • @Tahoe,是的!谢谢。固定。
    【解决方案2】:
    Pattern p = Pattern.compile("(?s)<!--(?:(?!-->).)*<!DOCTYPE");
    

    (?:(?!--&gt;).)* 一次匹配一个字符, 检查它不是--&gt; 的第一个字符。

    (?s) 设置 DOTALL 模式(也称为单行模式),允许 . 匹配换行符。

    如果可能有两个或多个匹配项,并且您想单独查找它们,则可以将 * 替换为非贪婪的 *?,如下所示:

    "(?s)<!--(?:(?!-->).)*?<!DOCTYPE"
    

    例如,将该正则表达式应用于问题文本将找到两个匹配项,而原始正则表达式将找到一个更长的匹配项。

    【讨论】:

      【解决方案3】:
      \<!--([\s\S](?!--\>))*?(?=\<\!DOCTYPE)
      

      这使用负前瞻来防止 --> 并使用正前瞻来查找 /strong> 这是atomic assertions (lookahead and behind) 的一个很好的参考。

      【讨论】:

      • 非常感谢。这也对我有用。只是在 Java String 中,我们必须使用 \\ 而不是 \ 来转义反斜杠。
      【解决方案4】:

      正则表达式可能不是您问题的最佳答案。您是否尝试过将第一行与其他所有内容分开并查看它是否包含--&gt;

      具体来说,类似:

      String htmlString;
      String firstLine = htmlString.split("\r?\n")[0];
      if(firstLine.contains("-->"))
          ;//no match
      //match
      

      【讨论】:

        【解决方案5】:

        我手边没有测试系统,所以我不能给你正则表达式,但你应该在 Pattern 文档中查看名为 negative lookahead assertion 的东西。这使您可以表达以下形式的规则:如果没有后跟,则匹配此。

        它应该可以帮助你:)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-17
          • 1970-01-01
          • 2021-12-08
          • 1970-01-01
          • 1970-01-01
          • 2021-09-25
          相关资源
          最近更新 更多