问题:转弯
"My Testtext TARGETSTRING My Testtext"
进入
"My Testtext targetstring My Testtext"
Perl支持可以在替换字符串中使用的“ \ L”操作。
模式类不支持此操作:
此类不支持的Perl构造:[…]预处理操作\ l \ u,\ L和\ U。 https://docs.oracle.com/javase/10/docs/api/java/util/regex/Pattern.html
您无法在Java正则表达式中执行此操作。您必须使用String.toUpperCase()和手动进行后期处理toLowerCase()。
String.toUpperCase()
toLowerCase()
这是一个如何使用正则表达式查找和大写句子中长度至少为3的单词的示例
String text = "no way oh my god it cannot be"; Matcher m = Pattern.compile("\\b\\w{3,}\\b").matcher(text); StringBuilder sb = new StringBuilder(); int last = 0; while (m.find()) { sb.append(text.substring(last, m.start())); sb.append(m.group(0).toUpperCase()); last = m.end(); } sb.append(text.substring(last)); System.out.println(sb.toString()); // prints "no WAY oh my GOD it CANNOT be"
appendReplacement
appendTail
请注意,上述解决方案使用substring和管理tail索引等。实际上,如果使用Matcher.appendReplacement和,则可以不用这些appendTail。
substring
tail
Matcher.appendReplacement
StringBuffer sb = new StringBuffer(); while (m.find()) { m.appendReplacement(sb, m.group().toUpperCase()); } m.appendTail(sb);
请注意sb,现在是StringBuffer而不是StringBuilder。在Matcher提供StringBuilder重载之前,StringBuffer如果要使用这些方法,您将受制于较慢的对象。
sb
StringBuffer
StringBuilder
Matcher
由您决定是否值得在效率较低的情况下取舍以提高可读性。