正则表达式是非常有力的处理字符串的手段,java中很多String的函数都支持正则表达式。
关于Java语言中正则表达式的官方介绍请看这里:
https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html
这里有最权威,最全面的Java正则表达式的介绍。
最近写代码的时候遇到了这样的问题:
将形如(1+3*m+s*b+c*v)^3的表达式化简为形如(1+3*m+s*b+c*v)*(1+3*m+s*b+c*v)*(1+3*m+s*b+c*v)的格式,也就是说,括号内是正常的多项式表达式,括号外是一个正整数幂,值得注意的是,这个幂可能是十位数,也可能是百位数。
显然我们可以用正则表达式处理它,不过,这里,仅仅用replaceAll()函数恐怕不够了。
因为我们要insert的字符串,是经过函数处理的一串字符,而这个函数接收的参数包括了我们正则表达式匹配到的内容。
说到这里有必要说一下replaceAll()函数,这个函数replaceAll(1,2),1是正则字符串,2是代替1的表达式,由于我们要替换的字符串是被匹配的字符串中的一部分的某些次(^后面的数字那么多次),所以,这里是不能仅仅用这个函数解决的。而且如果2的位置是一个函数g的话,在该函数g内部是无法处理匹配的字符串的,向g传入”$1“字符串的话,g收到的就真的是”$1“,而不是我们期望的被正则表达式匹配的字符串的第一对括号中的内容。同样,对于g的返回值,replaecAll也是”任人唯亲“,只要是”$1“,就会认为是被正则表达式匹配的字符串的第一对括号中的内容。replaceAll函数不会管这个字符串是哪来的。
所以,这里不得不采取更高级的处理方式。
如《Regular Expressions Cookbook》一书中给出的一个例子:
Problem
You want to replace all matches of a regular expression with a new string that you build
up in procedural code. You want to be able to replace each match with a different string,
based on the text that was actually matched.
For example, suppose you want to replace all numbers in a string with the number
multiplied by two.
StringBuffer resultString = new StringBuffer();
Pattern regex = Pattern.compile("\\d+");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
Integer twiceasmuch = Integer.parseInt(regexMatcher.group()) * 2;
regexMatcher.appendReplacement(resultString, twiceasmuch.toString());
}
regexMatcher.appendTail(resultString);
此方法亲测可用!
超级赞!
详细的代码就不放了,思路和上图中的一模一样!