当前位置: 首页 > 面试题库 >

Java用大写字母在特定字符前后(前后)替换字符

臧翰采
2023-03-14
问题内容

我有这种输入

word w'ord wo'rd

我需要将单词开头和之后的'字符都转换为大写(可以多次存在)。

我需要的输出(使用前面的示例)是

word W'Ord Wo'Rd

我尝试了一个简单的模式

s.replaceAll("(\\w)(\\w*)'(\\w)", "$1");

但我无法将组1和3转换为大写

编辑:发现主要问题中的一个小错误后,我编辑了@Wiktor Stribizew代码,以包括我错过的案例。

Matcher m = Pattern.compile("(\\w)(\\w*)'(\\w)").matcher(s);
StringBuffer result = new StringBuffer();
while (m.find()) {
    m.appendReplacement(result, m.group(1).toUpperCase() + m.group(2) + "'" + m.group(3).toUpperCase());
}
m.appendTail(result);
s = result.toString();

问题答案:

您需要使用Matcher#appendReplacementJava才能处理匹配。这是一个例子:

String s = "word w'ord wo'rd";
StringBuffer result = new StringBuffer();
Matcher m = Pattern.compile("\\b(\\w)(\\w*)'(\\w(?:'\\w)*)").matcher(s);
while (m.find()) {
    m.appendReplacement(result, 
        m.group(1).toUpperCase()+m.group(2) + "'" + m.group(3).toUpperCase());
}
m.appendTail(result);
System.out.println(result.toString());
// => word W'Ord Wo'Rd

参见Java演示

相当于Java 9+(demo):

String s = "wo'rd w'ord wo'r'd";
Matcher m = Pattern.compile("\\b(\\w)(\\w*)'(\\w(?:'\\w)*)").matcher(s);
System.out.println(
    m.replaceAll(r -> r.group(1).toUpperCase()+r.group(2) + "'" + r.group(3).toUpperCase())
);
//wo'rd w'ord wo'r'd => Wo'Rd W'Ord Wo'R'D
//word w'ord wo'rd => word W'Ord Wo'Rd

模式分解

  • \b -引导词边界
  • (\w) -第1组:单字字符
  • (\w*) -第2组:零个或多个字字符
  • ' -单引号
  • (\w(?:'\w)*) -第3组:
    • \w -一个字符
    • (?:'\w)* -零个或多个序列:
    • ' -单引号
    • \w -一个字。

现在,如果要使模式更精确,则可以更改\w应该与匹配小写字母的和\p{Ll}\w匹配与任何小写字母的\p{L}。模式看起来像"(?U)\\b(\\p{Ll})(\\p{L}*)'(\\p{Ll}(?:'\\p{Ll})*)"-但是,'如果小写字母之前有大写字母(例如wo'r'D's->
中的字母),则冒着将字母小写()的风险Wo'R'D's(?U)Pattern.UNICODE_CHARACTER_CLASS使\b单词边界能够识别Unicode
的内联修饰符。



 类似资料:
  • 我正在尝试使用正则表达式将大写字母替换为相应的小写字母。因此 变成 在Sublime的文本中。如何在同时包含小写和大写字母的单词中使用小写字母?所以它会影响维纳斯,而不是维纳斯。

  • 问题内容: 表: 值: 我想之前替换字符串用。 结果: 如何使用子字符串和基于字符串中的字符进行替换? 问题答案: 您甚至不需要使用或,您可以使用以下命令: 您可以使用以下方法进行测试:

  • 我正在寻求帮助,我正在制定的代码,我希望它取代最后两个字母。我正在编写一个程序,它将: 将四个字母的单词替换为“FRED” 将以“ed”结尾的单词的最后两个字母替换为“id” 最后,如果单词以“di”开头,请将前两个字母替换为“id” 我对第二条规则有困难,我知道对于数字3,我可以使用replaceFirst();并使用长度作为第一条规则,但我不确定如何具体交换字符串中的最后两个字符。 以下是我目

  • 朋友们,可以在一个正则表达式中验证特殊字符的最小值、大写字母的最小值和数字的最小值吗? 字符串示例: 我想要的是: 我想要一个正则表达式来验证至少2个特殊字符、2个数字和2个大写字母

  • 我想要成功 用大括号()或[]替换的文本可从表1或表2中找到。 当前方法 如何改进代码跳过非必需循环?

  • 我尝试在每个“{”之间放置空白: 它适用于一个“{”: 在这里我想要t{estn{g。 谢谢你来看看。