2012-06-02 18 views
5

के हिस्से के साथ स्ट्रिंग को बदलें मेरे पास एक लंबी स्ट्रिंग है। मैं मिलान करने वाले रेगेक्स (समूह) के हिस्से के साथ सभी मैचों को प्रतिस्थापित करना चाहता हूं।मिलान रेगेक्स

उदाहरण के लिए:

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

मैं द्वारा सभी शब्दों "is" बदलना चाहते हैं, मान लें कि, "<h1>is</h1>" करते हैं। मामला मूल के समान ही होना चाहिए। तो अंतिम स्ट्रिंग मैं चाहता है:

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 मैं कोशिश कर रहा था:

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

परिणाम होगा जब आप इसे करने की कोशिश, क्या हुआ? –

+0

पैटर्न ठीक से मेल खाता है। जो मुझे समझ में नहीं आता है वह कैसे बदला जाए। – varunl

उत्तर

8

Matcher कक्षा आमतौर पर Pattern के संयोजन के साथ प्रयोग की जाती है।\b regex आदेश का उपयोग करते हुए एक शब्द सीमा (सफेद स्थान की तरह) पर मिलान हो जाएगा: स्ट्रिंग

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

नोट में सभी मैचों को बदलने के लिए Matcher.replaceAll() विधि का उपयोग करें। यह सुनिश्चित करने के लिए उपयोगी है कि केवल "शब्द" शब्द मिलान किया गया हो और न कि उन शब्दों में जिनमें "i" और "s" (जैसे "द्वीप") शामिल हैं।

4
इस तरह

:

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

$1 पाठ में # 1 समूह द्वारा कब्जा कर लिया है को संदर्भित करता आपका regex।

+0

इस समाधान का नकारात्मक पक्ष यह है कि यह हमेशा केस-संवेदी होगा। रेगेक्स को केस-असंवेदनशील होने के लिए परिभाषित करने का कोई तरीका नहीं है। – Michael

+2

@ माइकल - अगर आपको केस असंवेदनशीलता की आवश्यकता है तो बस रेगेक्स की शुरुआत में एक '(? I)' संशोधक शामिल करें। –

+0

ओह उसे नहीं पता था।मेरी टिप्पणी को अनदेखा करें। :( – Michael

0

बस इसके लिए बैकरेफर का उपयोग करें।

"This is a great day, is it not? If there is something, THIS IS it. <b>is</b>".replaceAll("[.>, ](is)[.<, ]", "<h1>$2</h1>"); करना चाहिए।

+0

फिर से, आप इस समाधान के साथ रेगेक्स को केस-असंवेदनशील नहीं बता सकते हैं। – Michael

+0

कभी भी नहीं, आप केस को असंवेदनशील बनाने के लिए '(? I)' के साथ रेगेक्स स्ट्रिंग को प्रीपेड कर सकते हैं। – Michael

3

माइकल के जवाब के लिए बेहतर है, लेकिन अगर आप ऐसा विशेष रूप से केवल [.>, ] और [.<, ] सीमाओं के रूप में चाहते हैं, तो आप इसे इस तरह से कर सकते हैं:

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) मामले अनदेखी से संकेत मिलता है; उन सभी चीज़ों को लपेटें जिन्हें आप ब्रैकेट के साथ पुन: उपयोग करना चाहते हैं, उन्हें $ 1 $ 2 और $ 3 के साथ पुन: उपयोग करें, उन्हें अपनी इच्छित चीज़ों में शामिल करें।

0

यह एक देर से इसके अलावा हो सकता है, लेकिन अगर किसी को भी
'बात' के लिए खोज की तरह इस की तलाश में है और यह भी वह 'कुछ' भी परिणाम के रूप में लिया जाना है,

पैटर्न पी की जरूरत है = Pattern.compile ("([^] ) है ([^ \।])");
स्ट्रिंग परिणाम = m.replaceAll ("< \ h1> $ 1is $ 2 </h1>");

< \ h1> कुछ </h1> भी

संबंधित मुद्दे