問題:回転
"My Testtext TARGETSTRING My Testtext"
に
"My Testtext targetstring My Testtext"
Perlは、replacement-stringで使用できる「\ L」操作をサポートしています。
パターンクラスはこの操作をサポートしていません:
このクラスでサポートされていないPerl構成:[...]前処理操作\ l\u、\ L、および\ U。 https://docs.Oracle.com/javase/10/docs/api/Java/util/regex/Pattern.html
Java regexではこれを行うことはできません。 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
。
StringBuffer sb = new StringBuffer();
while (m.find()) {
m.appendReplacement(sb, m.group().toUpperCase());
}
m.appendTail(sb);
sb
が StringBuffer
ではなく StringBuilder
になったことに注目してください。 Matcher
がStringBuilder
オーバーロードを提供するまで、これらのメソッドを使用したい場合は、より遅いStringBuffer
に悩まされます。
効率を下げて可読性を高めるというトレードオフが価値があるかどうかは、あなた次第です。
regexpキャプチャグループ を使用できます(本当に正規表現を使用する必要がある場合、つまり、 "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
^^ ^ ^^^
「Java 8」のこの変換関数はどうですか
/**
* Searches the given pattern in the given src string and applies the txr to the
* matches
*
* @param src The string to be converted
* @param pattern the pattern for which the transformers to be applied.
* @param txr The transformers for the mathed patterns.
* @return The result after applying the transformation.
*/
private static String fromTo(String src, String pattern, Function<String, String> txr) {
Matcher m = Pattern.compile(pattern).matcher(src);
StringBuilder sb = new StringBuilder();
int last = 0;
while (m.find()) {
sb.append(src.substring(last, m.start()));
sb.append(txr.apply(m.group(0)));
last = m.end();
}
sb.append(src.substring(last));
return sb.toString();
}