java - 使用 Java RegEx 全局替换分组匹配

标签 java regex perl regex-lookarounds

我有以下 PERL 一行代码。这个 perl RegEx 只是将给定句子中所有单词的首字母大写。

$val =~ s/\b(.)(.*?)\b/uc($1).$2/eg;

输入:

"united states corp"

输出

"United States Corp"

但是,我需要在JAVA中实现相同的功能。我正在做以下事情。

String INPUT="united states corp"
Pattern p = Pattern.compile("\\b(.)(.*?)\\b");
Matcher m = p.matcher(INPUT);
if (m.find()) {
    INPUT = m.replaceAll(m.group(1).toUpperCase() + m.group(2));
}

输入:

"United States Corp".

输出:

"UnitedUnitedUnitedUnitedUnited"

谢谢。

最佳答案

要匹配单词的第一个小写字母(为了不匹配那些已经大写的字母),您可以使用 \b\p{Ll} 正则表达式并使用 Matcher#appendReplacement( ) 操作匹配的方法:

String INPUT="united states corp";
Pattern p = Pattern.compile("\\b\\p{Ll}");
StringBuffer result = new StringBuffer();
Matcher m = p.matcher(INPUT);
while (m.find()) {
    m.appendReplacement(result, m.group().toUpperCase());
}
m.appendTail(result);
System.out.println(result.toString()); // => United States Corp

请参阅Java demo .

根据 Java Matcher class docs :

The appendReplacement and appendTail methods can be used in tandem in order to collect the result into an existing string buffer

因此,如果您使用当前的正则表达式 "\\b(.)(.*?)\\b",则需要替换 while (m.find ()) 主体与

m.appendReplacement(result, m.group(1).toUpperCase() + m.group(2));

关于java - 使用 Java RegEx 全局替换分组匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51342824/

相关文章:

regex - 如何使用 parsley.js 模式标签?

perl - Perl 中的 RSA key

java - 如何打包jar文件和mysql数据库

java - 使用扫描仪扫描字数和行数 (Java)

java - 使用java正则表达式从字符串中删除括号

regex - 如何从复杂字符串中提取字符串?

java - 在单元测试时访问私有(private) ArrayList (Java/JUnit)

java - 如何使用 Spring 和 JDBCTemplate 取消长时间运行的查询?

perl - "perl -n"和 "perl -p"有什么区别?

perl - 如何下载登录后重定向的页面?