Java Regex To大写

时间:2014-02-11 17:10:11

标签: java regex

所以我有一个像

这样的字符串
  

2000cc车辆的翻新发动机

我想把它变成

  

2000CC车辆的翻新发动机

2000CC的资本cc。我显然不能做text.replaceAll("cc","CC");,因为它会用资本版本替换cc的所有出现,所以加速器这个词将成为一个CSelerator。在我的场景中,前四位数字将始终是四位数后跟字母cc,所以我认为这可以用正则表达式来完成。

我的问题是如何在Java中将cc转换为CC,当它跟随4位数并获得我期望的结果时?

String text = text.replaceAll("[0-9]{4}[c]{2}", "?");

4 个答案:

答案 0 :(得分:7)

您可以尝试使用

text = text.replaceAll("(\\d{4})cc", "$1CC");
//                          ↓          ↑
//                          +→→→→→→→→→→+

技巧是将数字放在组中(通过括号),然后在替换部分使用此组中的匹配(通过$x x是组号)。

如果您想确保匹配的文字不是其他单词的一部分,则可以使用word boundaries "\\b"包围该正则表达式。您还可以使用look-adound机制确保匹配文本之前和/或之后没有字母数字字符。

答案 1 :(得分:4)

如果您只需将cc转换为大写,如果已修复,则可以将匹配替换为CC

在Java中没有针对此的单行通用解决方案。您必须使用Matcher#appendReplacement()Matcher#appendTail()

执行此操作
String str = "Refurbished Engine for 2000cc Vehicles";
Pattern pattern = Pattern.compile("\\d{4}cc");
Matcher matcher = pattern.matcher(str);

StringBuffer result = new StringBuffer();
while (matcher.find()) {
    matcher.appendReplacement(result, matcher.group().toUpperCase());
}

matcher.appendTail(result);

System.out.println(result.toString());

答案 2 :(得分:2)

一种方法是使用()将数字部分捕获为一个组,然后在替换中使用该组的反向引用:

经过测试:

public static void main(String [] args) {
    String s = "1000cc abc 9999cc";
    String t = s.replaceAll("(\\d{4})cc", "$1CC");
    System.err.println(t);
}

答案 3 :(得分:2)

你也许可以这样做:

String text = text.replaceAll("(?<=\\b[0-9]{4})cc\\b", "CC");

(?<=\\b[0-9]{4})是一种积极的观察,只有在cc前面有4位数字(不超过4)且此规则由字边界\\b强制执行时才能确保匹配(此仅在单词的末尾匹配,其中单词被定义为匹配\\w+)的一组字符。此外,由于lookbehinds是零宽度断言,因此它们不会在匹配中计数。

如果cc的数量可以变化,那么最简单的方法是检查一个数字:

String text = text.replaceAll("(?<=[0-9])cc\\b", "CC");