Hier ist ein Beispiel dafür, wie Sie mit Regex Wörter mit einer Länge von mindestens 3 in einem Satz finden und groß schreiben
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"
Hinweis zu appendReplacement und appendTail
Beachten Sie, dass die obige Lösung verwendet substring und verwaltet ein tail index usw. Tatsächlich können Sie auf diese verzichten, wenn Sie verwenden Matcher.appendReplacement und appendTail.
StringBuffer sb = new StringBuffer();
while (m.find()) {
m.appendReplacement(sb, m.group().toUpperCase());
}
m.appendTail(sb);
Beachten Sie, wie sb ist jetzt ein StringBuffer anstatt StringBuilder. Noch bis Matcher bietet StringBuilder Überlastungen, du bleibst beim Langsameren StringBuffer wenn Sie diese Methoden verwenden möchten.
Es liegt an Ihnen, ob sich der Kompromiss zwischen geringerer Effizienz für höhere Lesbarkeit lohnt oder nicht.
Um dies auf Regexp-Ebene zu tun, müssen Sie verwenden U um den Großbuchstabenmodus einzuschalten und E um es auszuschalten. Hier ist ein Beispiel für die Verwendung dieser Funktion in IntelliJ IDEA find-and-replace Dialog, der einen Satz von Klassenfeldern in JUnit-Assertionen umwandelt (im IDE-Tooltip ist das Ergebnis von find-and-replace Transformation):
Dies ist jedoch IntelliJ-spezifisch, normale reguläre Java-Ausdrücke unterstützen dies nicht.
– ddekany
24. März ’17 um 18:32
Es gibt auch L für Kleinbuchstabenmodus (der auch mit beendet wird E). Dies ist natürlich auch IntelliJ-spezifisch.
Du könntest das benutzen Regexp-Erfassungsgruppe (wenn Sie wirklich Regex verwenden müssen, das heißt, wenn “TARGETSTRING” ist komplex genug und “regelmäßig” genug, um die Erkennung durch eine Regex zu rechtfertigen).
Sie würden sich dann bewerben toLowerCase() zur Gruppe 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);
}
}
Soll das Pseudo-Code sein? Der "$1".toLowerCase() wertet offensichtlich zuerst aus, also replaceAll sieht nur "$1", was bedeutet, dass es nichts tut.
– Matthew Flaschen
5. Mai ’10 um 6:18
@Matthew: Richtig, die eigentliche Regex-basierte Lösung ist etwas komplexer. Ich habe die Antwort geändert, um sie widerzuspiegeln.
– VonC
5. Mai ’10 um 6:22
SCHÖNER Trick mit sb.replace um die Tatsache auszunutzen, dass die Ersetzung immer(?) die gleiche Länge wie die ursprüngliche Zeichenfolge hat. Sonst würde das nicht funktionieren. Sehr schön!
– Polygenschmierstoffe
5. Mai ’10 um 6:45
Leider behält die Groß-/Kleinschreibung die Stringlänge nicht bei. Siehe: Behält Javas toLowerCase() die ursprüngliche Stringlänge bei?.
– MicSim
13. Januar ’15 um 11:43
YCF_L
Java9+
Ab Java 9+ können Sie verwenden String::replaceAll wo du a . verwenden kannst Function<MatchResult, String> zum Beispiel verwenden wir das Beispiel der Polygenschmierstoffe:
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);
Oder nur :
String result = Pattern.compile(regex)
.matcher(text)
.replaceAll(matche -> matche.group().toUpperCase());
Ausgabe
this IS just A test which upper ALL short words
^^ ^ ^^^
Wie wäre es mit dieser Transformationsfunktion in “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();
}
.
4777300cookie-checkVerwenden Sie Java und RegEx, um Groß-/Kleinschreibung in einen String umzuwandelnyes
Ich verstehe das nicht. Was ist falsch mit
"my testtext TARGETSTRING my testtext".toLowerCase();
?– WVrock
9. Juni ’15 um 14:22
Entschuldigung, das Beispiel war schlecht. toLowerCase funktioniert nicht für “Mein Testtext TARGETSTRING Mein Testtext”
– Andreas
10. Juni ’15 um 17:48