【问题标题】:Java Regex Replace with Capturing Group [duplicate]Java正则表达式替换为捕获组[重复]
【发布时间】:2010-11-19 15:55:57
【问题描述】:

可能重复:
Java Regex Replace with Capturing Group

有没有办法用捕获组的修改内容替换正则表达式?

例子:

Pattern regex = Pattern.compile("(\\d{1,2})");
Matcher regexMatcher = regex.matcher(text);
resultString = regexMatcher.replaceAll("$1"); // *3 ??

我想用 $1 乘以 3 替换所有出现的事件。

编辑:

好像有什么问题:(

如果我使用

Pattern regex = Pattern.compile("(\\d{1,2})");
Matcher regexMatcher = regex.matcher("12 54 1 65");
try {
    String resultString = regexMatcher.replaceAll(regexMatcher.group(1));
} catch (Exception e) {
    e.printStackTrace();
}

它抛出一个 IllegalStateException: No match found

但是

Pattern regex = Pattern.compile("(\\d{1,2})");
Matcher regexMatcher = regex.matcher("12 54 1 65");
try {
    String resultString = regexMatcher.replaceAll("$1");
} catch (Exception e) {
    e.printStackTrace();
}

工作正常,但我无法更改 $1 :(

edit2:

现在,它正在工作:)

【问题讨论】:

  • 如果其他用户遇到类似问题,您能否详细说明您为纠正该问题所做的工作? :)
  • 我不知道如何在 Java 中做到这一点,但在 Perl 中这很容易。 :-P $foo = '12 54 1 65'; $foo =~ s/(\d{1,2})/$1 * 3/eg;
  • 这是一个描述如何做的答案,我不知道它现在在哪里......(我接受了一个解决问题的问题,但消失了。奇怪...... )
  • 我认为 [this question][1] 的答案可以帮助您。 [1]:stackoverflow.com/questions/375420/…

标签: java regex


【解决方案1】:

几年前,Elliott Hughes 在他的blog 上发布了该问题的最终解决方案。 Elliott 一直在在线版本中引入对其他类的无意义依赖,所以我将在此处发布一个独立版本(依赖仅在 main() 方法中的测试中)。

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));

  }
}

【讨论】:

    【解决方案2】:

    不,你不能用正则表达式来做到这一点。正则表达式没有数值的概念,因此无法对数字进行算术运算(假设您想将“12 54 1 65”转换为“36 162 3 195”)。

    请注意,使用某些语言和正则表达式实现,您可以做到这一点(克里斯发布的 Perl),但这不是正则表达式,尤其不是 Java 正则表达式。 你说你已经解决了这个问题,所以我猜你采用了“手动”方式,将每个匹配项转换为一个整数并将其乘以 3。

    【讨论】:

      猜你喜欢
      • 2014-06-19
      • 2010-11-19
      • 2014-08-30
      • 1970-01-01
      • 1970-01-01
      • 2013-01-31
      • 2011-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多