Java正则表达式转为大写

4

我有一个字符串:

Refurbished Engine for 2000cc Vehicles

我想将其转换为:

Refurbished Engine for 2000CC Vehicles

在2000CC上,cc要大写。显然,我不能使用 text.replaceAll("cc","CC"); 来替换所有的 cc,否则单词 accelerator 会变成 aCCelerator。在我的情况下,前四位数字将始终是四个数字,后跟字母 cc,因此我认为可以使用正则表达式来完成此操作。

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

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

你可以使用 text.toUpperCase()。 - Zeus
1
顺便说一下,您不需要括号将“c”括起来。 ;) - tenub
@Zeus 这将把句子中的所有其他单词都转换为大写。我需要首字母大写,因此我使用Apache的WordUtils.CapitalizeFully方法来实现这一点。感谢您的建议。 - Ashley Swatton
4个回答

7
您可以尝试使用以下方法:
text = text.replaceAll("(\\d{4})cc", "$1CC");
//                          ↓          ↑
//                          +→→→→→→→→→→+

把数字放在一组(用括号括起来),然后在替换部分中使用该组的匹配(通过$ x,其中x是组号),这是关键。
如果要确保匹配的文本不是其他单词的一部分,则可以将该正则表达式与单词边界 "\\ b"括起来。您还可以使用环视技术来确保匹配的文本之前和/或之后没有字母数字字符。

@Gene \\1 在正则表达式部分起作用,在替换部分中使用 $1 - Pshemo
@Gene 没问题。每个人都会犯错 :) - Pshemo
@AshleySwatton,我很高兴它对你有用 :) 随意接受你最喜欢的答案,因为这里发布的所有答案都可以解决你的问题。 - Pshemo
+1 简洁明了的答案。我从未见过 $ 语法被这样使用过(我在 Java 中没有使用过太多正则表达式),但是这里是 javadoc - 可以查看 appendReplacement 方法 - 如果有人感兴趣,可以看看最终评估替换字符串的代码 :) - mdl
这很奇怪。我想我们刚刚在SO上看到了一个bug。这一开始显示的是我的答案,然后变成了Pshemo的答案。嗯......有趣![我喜欢这个解决方案比被接受的更好。] - Gene
显示剩余2条评论

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());

谢谢。这个很有效,也适用于“加热器控制面板靠近左侧(1700cc-2000cc)”。 - Ashley Swatton
1
在Java中,这个问题没有通用的一行代码解决方案。其他答案中的一行代码可以正常工作。 - Christoffer Hammarström
1
@ChristofferHammarström 你指的是哪些通用的一行代码呢?我只看到了特殊情况下的一行代码。 - Marko Topolnik
哦,你说得对。我完全不知道自己在想什么。 - Christoffer Hammarström

2
您可以尝试以下操作:

您可以尝试以下操作:

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

(?<=\\b[0-9]{4})是一个正向先行断言,只有在cc前面有4个数字(不能多于4个数字,并且这个规则由单词边界\\b执行(它仅在单词的末尾匹配,其中单词定义为与\\w+匹配的一组字符)),才能确保匹配。此外,由于先行断言是零宽度断言,因此它们不计入匹配结果。

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

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

2

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

这是经过测试的:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接