2012-06-02 15 views
5

Uzun bir dizim var. Tüm eşleşmeleri eşleşen regex (grup) ile değiştirmek istiyorum. ÖrneğinDizeyi eşleşen normal ifadenin bir parçası ile değiştirin

:

Ben bütün kelimeleri "is" değiştirmek istiyor
String = "This is a great day, is it not? If there is something, THIS IS it. <b>is</b>". 

, en, "<h1>is</h1>" diyelim. Dava orijinal ile aynı kalmalıdır. Yani istediğim son dizesidir:

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>. 

regex Deniyordum: Bunun gibi

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

sonuçlanacaktır, ne oldu? –

+0

Desen düzgün eşleşiyor. Anlamadığım şey nasıl değiştirilir. – varunl

cevap

8

Matcher sınıfı, yaygın olarak Pattern ile birlikte kullanılır. (Boşluk gibi) sözcük sınırında maç olacak \b regex komutunu kullanarak: dize

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>"); 

Not tüm eşleşmeleri değiştirmek için Matcher.replaceAll() yöntemi kullanın. Bu, yalnızca "kelimesinin" kelimesinin eşleştiğinden ve "i" ve "s" ("ada" gibi) harflerini içeren sözcüklerden emin olmamak için kullanışlıdır.

4

:

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

$1 grup 1. tarafından yakalanan metnidir regex'in.

+0

Bu çözümün olumsuz tarafı, her zaman büyük/küçük harfe duyarlı olmasıdır. İntiksansı büyük/küçük harfe duyarlı olmayan bir şekilde tanımlamanın yolu yoktur. – Michael

+2

@Michael - Büyük/küçük harf duyarsızlığına ihtiyacınız varsa, regex'in başına bir '(? I)' değiştirici eklemeniz yeterlidir. –

+0

Oh bunu bilmiyordu.Yorumumu görmezden gel. :( – Michael

0

Bunun için bir geri referans kullanın.

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

+0

Yine, regex'in bu çözüm ile büyük/küçük harfe duyarlı olduğunu söyleyemezsiniz – Michael

+0

Nevermind, regex dizgisini '(? I)' ile büyük/küçük harfe duyarsız hale getirebilirsiniz. – Michael

3

Michael'ın cevabı daha iyidir, ancak gerçekleşmesi durumunda özellikle yalnızca böyle yapabilirsin, sınırları gibi [.>, ] ve [.<, ] istediğiniz:

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) davayı görmezden belirtmek için; parantez ile yeniden kullanmak istediğiniz her şeye sarın, onları 1 $ 2 ve 3 $ ile yeniden kullanın, onları istediğiniz gibi birleştirin. Herkes'şey' aranıyor
gibi bunu arıyorsa ve ayrıca 'Something' de sonuç olarak alınacak,

Desen p ihtiyacı varsa

0

O geç bir ek olabilir, ama = Pattern.compile ("([^] ) ([^ \.])");
Dize sonucu = m.replaceAll ("< \ h1> $ 1is $ 2 </h1>"); Bunu çalıştığımızda

< \ h1> Bir şey </h1> çok

İlgili konular