Wenn es keine Übereinstimmung in der Karte ist, mapping.get()
null
in diesem Code zurückkehren würde:
String replace = mapping.get(matcher.group());
matcher.appendReplacement(sb, replace + " ");
Ich bin mir nicht sicher, was Sie erwartet haben. Es scheint, als ob Sie dachten, dass, wenn die Zeichenfolge nicht in der Karte enthalten wäre, der Code magisch wissen würde, dass Sie die appendReplacement
überspringen möchten. Aber natürlich kann Code keine Gedanken lesen und funktioniert nicht magisch. Wenn replace
null
ist, würde das Programm trotzdem fortfahren und versuchen, die nächste Zeile auszuführen.
Das Ergebnis, das Sie sehen, liegt daran, wie der Operator +
an Strings arbeitet; Wenn einer der Operanden null
ist, dann fügt +
tatsächlich die vierstellige Zeichenfolge "null"
in das Ergebnis ein. So ist replace + " "
"null "
, und der Code ersetzt Ihre nicht übereinstimmende Zeichenfolge mit diesem. (Dies jedoch:
matcher.appendReplacement(sb, replace);
hätte Ihnen eine NullPointerException gegeben.)
Also im Grunde, wollen Sie ihm sagen, nicht auf den Ersatz zu tun, wenn es keine Übereinstimmung gibt, und es gibt ein paar Möglichkeiten, dies zu tun:
String replace = mapping.get(matcher.group());
if (replace != null) {
matcher.appendReplacement(sb, replace + " ");
}
oder
if (mapping.containsKey(matcher.group())) {
String replace = mapping.get(matcher.group());
matcher.appendReplacement(sb, replace + " ");
}
Wegen die Art und Weise appendReplacement
funktioniert, wenn Sie es für eine matcher.find()
überspringen, berührt es nicht matcher
's Position anhängen. Wenn also beim nächsten Mal durch die Schleife eine Übereinstimmung gefunden wird, wird die vorherige Übereinstimmung (die keine Zuordnung hatte) zu diesem Zeitpunkt kopiert. Oder, wenn wir aus der Schleife herausfallen, würde die vorherige Übereinstimmung durch appendTail
kopiert werden.
Aber beachten Sie, dass der Code, den Sie geschrieben haben, extra Leerzeichen in das Ergebnis einfügt. Wenn es das ist, was Sie wollen, dann möchten Sie vielleicht den Ersatz reparieren, so dass es zusätzlichen Platz hinzufügt, auch wenn es keine Zuordnung gibt, anstatt es einfach in den nächsten append
zu kopieren.
String replace = mapping.get(matcher.group());
if (replace == null) {
replace = matcher.group();
}
matcher.appendReplacement(sb, replace + " ");
die in der Tat würde "ddd"
durch "ddd "
in Ihrem Beispiel ersetzen. Sie müssen entscheiden, wie Sie mit den Leerzeichen umgehen möchten. Vielleicht wollten Sie wirklich keine zusätzlichen Räume? Denken Sie daran, dass die Methoden append
Text von der Eingabe bis zu dem übereinstimmenden Punkt kopieren, einschließlich dieser Leerzeichen. Sie müssen also kein zusätzliches Leerzeichen einfügen, es sei denn, Sie möchten die Anzahl der Leerzeichen im Ergebnis wirklich erhöhen.
Da Sie auf Ihrer Karte nicht den Schlüssel 'dddd' haben, ist es richtig, ** null ** zurückzugeben. – developer033