代码之家  ›  专栏  ›  技术社区  ›  Omniwombat

如何避免Java正则表达式匹配中的隐式“^”和“$”呢?

  •  4
  • Omniwombat  · 技术社区  · 17 年前

    我一直在努力在Java1.4.2中进行一些相对简单的正则表达式匹配。我对Perl的工作方式更为熟悉。下面是发生的事情:

    我尝试:

    Pattern myPattern= Pattern.compile("^<foo>");
    Matcher myMatcher= myPattern.matcher("<foo><bar>");
    System.out.println(myMatcher.matches());
    

    我得到“假”

    我习惯于说:

    print "<foo><bar>" =~ /^<foo>/;
    

    这确实是真的。

    this 上面说:

    当我尝试时:

    Pattern myPattern= Pattern.compile("^<foo>.*");
    Matcher myMatcher= myPattern.matcher("<foo><bar>");
    System.out.println(myMatcher.matches());
    

    然后返回预期的true。但我不想要那种模式。终止。*应该不是必需的。

    myMatcher.reset();
    

    以防在关闭属性后需要刷新它。不走运。随后调用.matches()仍然返回false。

    我忽略了什么?

    编辑: 那很简单,谢谢。

    3 回复  |  直到 17 年前
        1
  •  11
  •   jdigital    17 年前

    使用匹配器 find matches (方法)

        2
  •  3
  •   matt b    17 年前

    Matcher.useAnchoringBounds() 是在JDK1.5中添加的,因此如果您使用的是1.4,我不确定它是否会对您有所帮助,即使它确实有效(请注意 @since 1.5 在Javadocs中)。

    Javadocs Matcher 还声明 the match() method

    试图匹配 全部的

    (强调矿山)

    这就解释了为什么你只有 .matches() == true 当您将图案更改为以结束时 .*

    要匹配从开始处开始的区域,但不一定需要匹配整个区域,请使用 find() lookingAt() 方法。

        3
  •  3
  •   erickson    17 年前

    换句话说,,

    Matcher myMatcher= myPattern.matcher("<foo><bar>");
    if (myMatcher.matches()) {
      System.out.println(myMatcher.group(0));
    }
    

    …应该打印什么?

    <foo> “,使用 find() 方法论 Matcher matches() . 如果您真的想在输入 开始 有“ <foo> '^' .

    如果您希望它匹配“ <foo><bar> ,您需要包括尾随字符 .*