2012-06-02 19 views
5

Ich habe eine lange Zeichenfolge. Ich möchte alle Übereinstimmungen mit einem Teil der passenden Regex (Gruppe) ersetzen.Ersetzen Sie die Zeichenfolge mit einem Teil der passenden Regex

Zum Beispiel:

String = "This is a great day, is it not? If there is something, THIS IS it. <b>is</b>". 

ich "is" durch alle Wörter ersetzen möchten, lassen Sie uns sagen, "<h1>is</h1>". Der Fall sollte gleich bleiben wie das Original. So ist die letzte Saite, die ich will, ist:

This <h1>is</h1> a great day, <h1>is</h1> it not? If there <h1>is</h1> something, 
THIS <h1>IS</h1> it. <b><h1>is</h1></b>. 

Die regex Ich habe versucht:

Pattern pattern = Pattern.compile("[.>, ](is)[.<, ]", Pattern.CASE_INSENSITIVE); 
+2

Wenn Sie es einmal, was passiert ist? –

+0

Das Muster passt gut. Was ich nicht verstehe, ist wie man es ersetzt. – varunl

Antwort

8

Die Klasse Matcher wird häufig in Verbindung mit Pattern verwendet. Verwenden Sie die Matcher.replaceAll() Methode alle Spiele in der Zeichenfolge

String str = "This is a great day..."; 
Pattern p = Pattern.compile("\\bis\\b", Pattern.CASE_INSENSITIVE); 
Matcher m = p.matcher(str); 
String result = m.replaceAll("<h1>is</h1>"); 

zu ersetzen Anmerkung: Mit dem \b regex Befehl an einer Wortgrenze (wie Leerzeichen) entsprechen. Dies ist hilfreich, um sicherzustellen, dass nur das Wort "ist" übereinstimmt und nicht Wörter, die die Buchstaben "i" und "s" (wie "Insel") enthalten.

4

So:

str = str.replaceAll(yourRegex, "<h1>$1</h1>"); 

Die $1 zum Text von Gruppe # erfasst bezieht sich 1 in deine Regex.

+0

Der Nachteil dieser Lösung ist, dass immer die Groß-/Kleinschreibung beachtet wird. Es gibt keine Möglichkeit, die Regex so zu definieren, dass sie nicht zwischen Groß- und Kleinschreibung unterscheidet. – Michael

+2

@Michael - Fügen Sie einfach einen '(? I)' -Modifikator am Anfang der Regex ein, wenn Sie die Groß-/Kleinschreibung nicht beachten müssen. –

+0

Oh, das wusste ich nicht.Ignoriere meinen Kommentar. :( – Michael

0

Verwenden Sie einfach eine Rückreferenz dafür.

"This is a great day, is it not? If there is something, THIS IS it. <b>is</b>".replaceAll("[.>, ](is)[.<, ]", "<h1>$2</h1>"); sollte tun.

+0

Erneut können Sie der Regex nicht sagen, dass die Groß- und Kleinschreibung bei dieser Lösung nicht beachtet werden muss. – Michael

+0

Sie können die Regex-Zeichenfolge mit '(? I)' versehen, um Groß- und Kleinschreibung zu vermeiden. – Michael

3

Michaels Antwort ist besser, aber wenn Sie speziell möchten passieren nur [.>, ] und [.<, ] als Grenzen, können Sie es wie folgt tun:

String input = "This is a great day, is it not? If there is something, THIS IS it. <b>is</b>"; 
Pattern p = Pattern.compile("(?<=[.>, ])(is)(?=[.<, ])", Pattern.CASE_INSENSITIVE); 
Matcher m = p.matcher(input); 
String result = m.replaceAll("<h1>$1</h1>"); 
1
yourStr.replaceAll("(?i)([.>, ])(is)([.<, ])","$1<h1>$2</h1>$3") 

(?i) anzuzeigen Fall ignorieren; wickle alles ein, was du mit eckigen Klammern wiederverwenden willst, verwende sie mit $ 1 $ 2 und $ 3, verknüpfe sie zu dem, was du willst.

0

Es kann eine späte Zugabe sein, aber wenn jemand für diesen wie
Suche nach ‚Dinge‘ suchen und er braucht auch ‚Something‘ auch als Ergebnis genommen werden,

Muster p = Pattern.compile ("([^] ) ist ([^ \.])");
String Ergebnis = m.replaceAll ("< \ h1> $ 1is $ 2 </h1>");

< \ h1 führen> Something </h1> zu

Verwandte Themen