【问题标题】:Understanding Pattern and Matcher理解模式和匹配器
【发布时间】:2009-12-15 20:44:40
【问题描述】:

考虑这段代码:

import java.util.regex.*;

public class Pattern3 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here

        Pattern p = Pattern.compile("Our"); //line 1
        Matcher m = p.matcher("Our mom and Our dad"); //line 2

        //p.compile(mom); commented line

         StringBuffer s = new StringBuffer();



       boolean found = m.find();

        while (found){
            m.appendReplacement(s, "My"); //line 3
            found=m.find();
        }

       m.appendTail(s); //line 4
       System.out.println(s);
    }

}

a) 为什么我需要在第 4 行调用 m.appendTrail(s) 来获取未截断的字符串?

b) 当我取消注释并将"mom" 放置为新的正则表达式时,为什么输出没有变化?

【问题讨论】:

    标签: java regex matcher


    【解决方案1】:

    只需阅读文档

    Matcher.appendReplacement 和

    Matcher.appendTail

    这里都说明了将这两种方法一起使用的目的。


    在创建匹配器实例之后更改模式当然不会影响已经创建的匹配器。您必须在创建匹配器之前更改模式。

    【讨论】:

      【解决方案2】:

      回答 b)

      Pattern.compile() 是一个静态方法。如果您取消注释p.compile();,它将创建一个您丢弃的新对象(它没有分配给任何东西)。要获得您想要的,您需要执行以下操作:

      p = Pattern.compile("mom");

      然后从新创建的模式中获取一个新的匹配器。

      【讨论】:

        【解决方案3】:

        回答a)

        .appendReplacement() 沿匹配器字符串(“Our mom and Our dad”)迭代,如果找到模式(“Our”),它用替换字符串(“My”)替换模式(“Our ") 并将其迭代的任何内容放入 StringBuffer (s) 中。如果没有找到更多的模式,它什么也不做。也就是说,它不会在最后一个模式之后附加任何内容。因此,调用 .appendTail() 来获取 Matcher String 的剩余部分。

        m.replaceAll("我的");可以用来达到同样的效果。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-10-04
          • 2016-06-04
          • 1970-01-01
          • 1970-01-01
          • 2018-03-26
          • 1970-01-01
          • 2022-12-13
          相关资源
          最近更新 更多