Java中的String类提供了replaceAll和replaceFirst方法,用来识别符合正则表达式的substring,并全局替换和只替换第一个substring。
但有时情况会更复杂一些。比如转换input string中所有的floating number的单位,从厘米转换为米。这时,之前的函数就帮不上忙了,我们要使用Java Regex其他类的更强大功能。
看看下面的例子。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class UnitConverter { private static final Pattern FLOATING_REGEX_PATTERN = Pattern.compile("[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?"); private static String convert(String input) { Matcher matcher = FLOATING_REGEX_PATTERN.matcher(input); StringBuffer sb = new StringBuffer(); while (matcher.find()) { // 转换匹配上的floating number matcher.appendReplacement(sb, Double.toString(Double.valueOf(matcher.group(0) / 100.0))); } // 加上Tail的部分 matcher.appendTail(sb); return sb.toString(); } |
下面是Test cases。
1 2 3 4 5 6 7 8 9 10 11 |
@Test public void testCmStringTommString() { assertEquals("1.0, 2.0", UnitConverter.convert("100.0, 200.0")); assertEquals("0.0, 0.0", UnitConverter.convert("0.0, 0.0")); assertEquals("1.0, abc", UnitConverter.convert("100.0, abc")); assertEquals("abc, 1.0, def", UnitConverter.convert("abc, 100.0, def")); assertEquals("abc, def", UnitConverter.convert("abc, def")); assertEquals("1.2, 2.3", UnitConverter.convert("1.2e2, 2.3e2")); assertEquals("1.2-3.1:6.0, 2.3", UnitConverter.convert("1.2e2-310.0:600, 2.3e3")); assertEquals("-1.2, -2.3", UnitConverter.convert("-1.2e2, -230")); } |