【问题标题】:Java Regex To UppercaseJava 正则表达式转大写
【发布时间】:2014-02-11 17:10:11
【问题描述】:

所以我有一个类似

的字符串

用于 2000cc 车辆的翻新发动机

我想把它变成

用于 2000CC 车辆的翻新发动机

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

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

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

【问题讨论】:

  • 你可以说 text.toUpperCase();
  • 顺便说一句,您不需要将“c”括起来的括号。 ;)
  • @Zeus 这会将句子中的所有其他单词转为大写。我需要使用 apaches WordUtils.CapitalizeFully 方法来实现这一点的前导大写字母。不过感谢您的建议。

标签: java regex


【解决方案1】:

你可以试试

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

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

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

【讨论】:

  • @Gene \\1 在正则表达式部分工作 $1 在替换部分
  • 完全正确。谢谢。 Java 字符串和正则表达式的混合(与 Perl、Ruby 等内置它们相比)让我一次又一次...
  • @Gene 没问题。发生在每个人身上:)
  • 到目前为止,这也适用于我的测试用例。这么多解决方案,我只能接受一个答案:-)。
  • @AshleySwatton 我很高兴它对你有用 :) 随意接受你最喜欢的答案,因为这里发布的所有答案都会解决你的问题。
【解决方案2】:

如果您只需要将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());

【讨论】:

  • 谢谢。这是一种享受,也适用于“Heater Control Pod Nearside (Left) 1700cc–2000cc”。
  • “Java 中没有针对此问题的单一通用解决方案。”?其他答案中的单行代码工作正常。
  • @ChristofferHammarström 您指的是哪些通用单行代码?我所看到的只是特殊情况的单线。
  • 哦,你是对的。我不知道我在想什么。
【解决方案3】:

你也许可以这样做:

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

(?&lt;=\\b[0-9]{4}) 是一个正向的lookbehind,仅当cc 前面有4 位数字(不超过4 位,并且此规则由单词边界\\b 强制执行时,才确保匹配一个词,其中一个词被定义为与\\w+匹配的一组字符。此外,由于lookbehinds是零宽度断言,它们不计入匹配项。

如果抄送的数量可以变化,那么只检查一个数字可能是最简单的:

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

【讨论】:

    【解决方案4】:

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

    这是经过测试的:

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

    【讨论】:

      猜你喜欢
      • 2013-01-18
      • 1970-01-01
      • 2011-06-21
      • 2011-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-17
      相关资源
      最近更新 更多