我想使用如下格式替换文本:
Text Input: (/ 5 6) + (/ 8 9) - (/ 12 3)
Pattern: (/ %s1 %s2)
Replacement: (%s1 / %s2)
Result: (5 / 6) + (8 / 9) - (12 / 3)
有没有办法轻松做到这一点?我查看了 Java API,但除了字符串格式(与这样的模式不匹配)和正则表达式(不允许我使用输入的匹配部分作为输出的一部分)之外找不到任何东西
尝试这个:
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对此问题的回答。
一个正则表达式,String.replaceAll(regex, replacement)
就是答案。
正则表达式不是为了装腔作势,但你的会是这样的:
String result = input.replaceAll(
"\\(\\s*(\\p{Punct})\\s+(\\d+)\\s+(\\d+)\\)",
"($2 $1 $3)");
编辑.... Adrian 的回答与我的回答“差不多”,可能更适合您。我的回答假设“/”字符是任何“标点”字符,应该复制到结果中,而不是只处理“/”。
从技术上讲,如果您只想要数学运算符,您可能希望\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)