欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

java正则表达式分组替换实现,java正则表达式分组,java正则表达式分组替

来源: javaer 分享于  点击 21255 次 点评:16

java正则表达式分组替换实现,java正则表达式分组,java正则表达式分组替


java正则表达式分组替换实现

java并没有提供类似csharp的正则表达式分组替换机制,要做高级的正则表达式分组替换需要自己实现。

所幸的是Elliott Hughes已经实现了java的正则表达是分组替换。

下面是它的实现代码:

import java.util.regex.*;/** * A Rewriter does a global substitution in the strings passed to its * 'rewrite' method. It uses the pattern supplied to its constructor, and is * like 'String.replaceAll' except for the fact that its replacement strings * are generated by invoking a method you write, rather than from another * string. This class is supposed to be equivalent to Ruby's 'gsub' when * given a block. This is the nicest syntax I've managed to come up with in * Java so far. It's not too bad, and might actually be preferable if you * want to do the same rewriting to a number of strings in the same method * or class. See the example 'main' for a sample of how to use this class. * * @author Elliott Hughes */public abstract class Rewriter{  private Pattern pattern;  private Matcher matcher;  /**   * Constructs a rewriter using the given regular expression; the syntax is   * the same as for 'Pattern.compile'.   */  public Rewriter(String regex)  {    this.pattern = Pattern.compile(regex);  }  /**   * Returns the input subsequence captured by the given group during the   * previous match operation.   */  public String group(int i)  {    return matcher.group(i);  }  /**   * Overridden to compute a replacement for each match. Use the method   * 'group' to access the captured groups.   */  public abstract String replacement();  /**   * Returns the result of rewriting 'original' by invoking the method   * 'replacement' for each match of the regular expression supplied to the   * constructor.   */  public String rewrite(CharSequence original)  {    this.matcher = pattern.matcher(original);    StringBuffer result = new StringBuffer(original.length());    while (matcher.find())    {      matcher.appendReplacement(result, "");      result.append(replacement());    }    matcher.appendTail(result);    return result.toString();  }  public static void main(String... args) throws Exception  {    String str = "12 54 1 65";    // anonymous subclass    Rewriter tripler = new Rewriter("(\\d{1,2})")    {      public String replacement()      {        int intValue = Integer.valueOf(group(1));        return String.valueOf(intValue * 3);      }    };    System.out.println(tripler.rewrite(str));    // inline subclass    System.out.println(new Rewriter("(\\d{1,2})")    {      public String replacement()      {        int intValue = Integer.valueOf(group(1));        return String.valueOf(intValue * 3);      }    }.rewrite(str));  }}

Rewriter类是一个抽象类,我们需要根据需要实现replacement()方法,该方法会根据正则匹配的分组的结果返回要替换的值。

相关栏目:

用户点评