【问题标题】:Java RegExp problem - .*(www).* vs. (www)Java RegEx 问题 - .*(www).* 与 (www)
【发布时间】:2009-03-09 18:49:35
【问题描述】:

我的一个朋友目前正在修补 Java 中的 JpCap,我们发现了一些关于 Java 正则表达式的有趣(也许?)问题。

仅捕获并随后分析 HTTP 流量。为此,他使用了这样的模式:

Pattern p = Pattern.compile("(www)");

但是我们俩都没有发现:为什么上面的模式根本不产生匹配,而下面的却是:

Pattern p = Pattern.compile(".*(www).*");

就我所见,这两者应该是相同的,不是吗? 我对正则表达式没有太多经验,所以这个问题可能有一个非常简单的答案:)

【问题讨论】:

  • 嗯....你的英语非常好!如果你没有附上 PS,我怀疑我们中的任何人都会想知道你的母语。
  • 有趣的是编辑摘要:“你的英语很棒!”
  • 希望编辑评论是个玩笑。为什么要去掉'hi'?
  • 哦,我多么希望这是个玩笑……哭泣

标签: java regex


【解决方案1】:

您的第一个模式只接受字符串 'www'。

第二种模式在任何地方都可以接受任何带有“www”的字符串。

website 包含有关 Java 正则表达式的更多信息。

【讨论】:

    【解决方案2】:

    哦,没关系,我刚刚发现我们都有点 API 盲 ;)

    我们正在使用

    Matcher.matches()
    

    将模式与整个字符串匹配,而不是

    Matcher.find()
    

    它试图在给定字符串的任何地方找到模式。

    感谢您的回答,不过! :)

    【讨论】:

      【解决方案3】:

      我假设您正在使用matches() 方法,因此在这种情况下正则表达式将应用于行。这意味着任何正则表达式都在“幕后”添加了行首和行尾字符。

      因此,您实际上得到的不是"(www)",而是"^(www)$",正如您所见,这显着改变了正则表达式的含义。

      有关 java 的这种细微差别的更多信息:http://www.regular-expressions.info/java.html

      【讨论】:

        【解决方案4】:

        正则表达式需要分隔符。

        " 符号仅用于声明字符串,因此不能用作分隔符。

        你的第二个例子有分隔符,所以它可以工作。

        【讨论】:

        • 没有。您正在考虑像 Perl 和 JavaScript 这样的脚本语言,它们在语言级别支持正则表达式。在 Java 中,就像 C# 和 Python 一样,正则表达式只是字符串。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多