如何使用输出中的部分输入替换文本?

时间:2013-05-06 23:05:40

标签: java replace

我想用以下格式替换文字:

Text Input: (/ 5 6) + (/ 8 9) - (/ 12 3)
Pattern: (/ %s1 %s2)
Replacement: (%s1 / %s2)
Result: (5 / 6) + (8 / 9) - (12 / 3)

有没有办法轻松完成这项工作?我查看了Java API但找不到除字符串格式之外的任何内容(这与这样的模式不匹配)和正则表达式(不允许我使用输入的匹配部分作为输出的一部分)< / p>

2 个答案:

答案 0 :(得分:4)

试试这个:

String input = "(/ 5 6) + (/ 8 9) - (/ 12 3)";
String result = input.replaceAll("\\(/ (\\d+) (\\d+)\\)", "($1 / $2)");

这假设您的%s组是数字,但可以轻松扩展以适应更复杂的组模式。

对于更复杂的替换,您可以在代码中检查每个匹配的模式:

import java.util.regex.*;
Pattern pattern = Pattern.compile("\\(/ (\\d+) (\\d+)\\)");
Matcher m = pattern.matcher(input);
StringBuffer result = new StringBuffer();
while (m.find())
{
    String s1 = m.group(1);
    String s2 = m.group(2);
    // either:
    m.appendReplacement(result, "($1 / $2)");
    // or, for finer control:
    m.appendReplacement(result, "");
    result.append("(")
          .append(s1)
          .append(" / ")
          .append(s2)
          .append(")");
    // end either/or
}
m.appendTail(result);
return result.toString();

要处理更多通用模式,请查看此问题的@rolfl's answer

答案 1 :(得分:3)

正则表达式和String.replaceAll(regex, replacement)就是答案。

正则表达不是为了佯装,而是你的看法:

String result = input.replaceAll(
          "\\(\\s*(\\p{Punct})\\s+(\\d+)\\s+(\\d+)\\)",
          "($2 $1 $3)");

编辑....阿德里安的答案与我的相同,并且可能更适合你。我的回答假定'/'字符是任何'标点符号'字符,应该复制到结果中,而不是只处理'/'。

从技术上讲,如果您只想要数学运算符,您可能希望将\p{Punct}替换为[-+/*](注意' - '必须始终优先)。

好的,工作示例:

    public static void main(String[] args) {
        String input = "(/ 5 6) + (/ 8 9) - (/ 12 3)";
        String regex = "\\(\\s*(\\p{Punct})\\s+(\\d+)\\s+(\\d+)\\)";
        String repl = "($2 $1 $3)";
        String output = input.replaceAll(regex, repl);
        System.out.printf("From: %s\nRegx: %s\nRepl: %s\nTo  : %s\n",
                input, regex, repl, output);
    }

产地:

  From: (/ 5 6) + (/ 8 9) - (/ 12 3)
  Regx: \(\s*(\p{Punct})\s+(\d+)\s+(\d+)\)
  Repl: ($2 $1 $3)
  To  : (5 / 6) + (8 / 9) - (12 / 3)