问题:转
"My Testtext TARGETSTRING My Testtext"
成
"My Testtext targetstring My Testtext"
Perl支持可以在替换字符串中使用的“\ L”操作。
Pattern-Class不支持此操作:
此类不支持的Perl构造:[...]预处理操作\ l \ u,\ L和\ U. https://docs.oracle.com/javase/10/docs/api/java/util/regex/Pattern.html
你不能在Java正则表达式中这样做。您必须使用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
and appendTail
请注意,上面的解决方案使用substring
并管理tail
索引等。事实上,如果你使用Matcher.appendReplacement
和appendTail
,你可以没有这些。
StringBuffer sb = new StringBuffer();
while (m.find()) {
m.appendReplacement(sb, m.group().toUpperCase());
}
m.appendTail(sb);
请注意sb
现在是StringBuffer
而不是StringBuilder
。直到Matcher
提供StringBuilder
重载,如果你想使用这些方法,你就会遇到更慢的StringBuffer
。
这取决于能否提高效率以获得更高的可读性是否值得。
你可以使用regexp capturing group(如果你真的需要使用正则表达式,也就是说,意思是“TARGETSTRING
”足够复杂并且“常规”足以证明正则表达式被检测到)。
然后,您将toLowerCase()
应用于组#1。
import java.util.regex.*;
public class TargetToLowerCase {
public static void main(String[] args) {
StringBuilder sb= new StringBuilder(
"my testtext TARGETSTRING my testtext");
System.out.println(sb);
String regex= "TARGETSTRING ";
Pattern p = Pattern.compile(regex); // Create the pattern.
Matcher matcher = p.matcher(sb); // Create the matcher.
while (matcher.find()) {
String buf= sb.substring(matcher.start(), matcher.end()).toLowerCase();
sb.replace(matcher.start(), matcher.end(), buf);
}
System.out.println(sb);
}
}
从Java 9+开始,你可以使用String::replaceAll,你可以使用Function<MatchResult, String>
,例如我们使用polygenelubricants的例子:
String text = "this is just a test which upper all short words";
String regex = "\\b\\w{0,3}\\b";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(text);
String result = matcher.replaceAll(matche -> matche.group().toUpperCase());
System.out.println(result);
要不就 :
String result = Pattern.compile(regex)
.matcher(text)
.replaceAll(matche -> matche.group().toUpperCase());
产量
this IS just A test which upper ALL short words
^^ ^ ^^^