所以我有一个像
这样的字符串2000cc车辆的翻新发动机
我想把它变成
2000CC车辆的翻新发动机
2000CC的资本cc。我显然不能做text.replaceAll("cc","CC");
,因为它会用资本版本替换cc的所有出现,所以加速器这个词将成为一个CSelerator。在我的场景中,前四位数字将始终是四位数后跟字母cc,所以我认为这可以用正则表达式来完成。
我的问题是如何在Java中将cc转换为CC,当它跟随4位数并获得我期望的结果时?
String text = text.replaceAll("[0-9]{4}[c]{2}", "?");
答案 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");