2017-04-21 11 views
6

पर विचार करें निम्न स्ट्रिंग की जगह:RegEx के माध्यम से लूपिंग से मेल खाता है और वर्तमान मैच

वह anchovies के साथ एक पिज्जा का आदेश दिया। दुर्भाग्यवश, वह वह चीज़ नहीं थी जिसे वह चाहता था। इसके अलावा, मशरूम, पेपरोनी और एन्कोवीज़ के साथ पिज्जा सामान्य पिज्जा से एन्कोवियों के मुकाबले काफी बेहतर है।

मान लें कि आपको pizza with (ingredients) को pizza with (ingredients) on a thin crust में बदलने की आवश्यकता है।

कि ऐसा करने के लिए, मैं एक Regex स्थापित किया था:

(?i:pizza with [a-zA-Z,\s]*?anchovies) 

यह तीन मैचों में कैप्चर करता है। फिर, मैं निम्नलिखित कोड का उपयोग कर प्रत्येक मैच के लिए on a thin crust जोड़ने के लिए आगे बढ़ना:

Pattern p = Pattern.compile("(?i:pizza with [a-zA-Z,\s]*?anchovies)"); 
Matcher m = p.matcher(string); 
while(m.find()) 
{ 
    string = string.replace(m.group(), m.group() + "on a thin crust."); 
} 

इस के उत्पादन में तो होगा:

वह एक पतली पर एक पतली परत पर anchovies के साथ एक पिज्जा का आदेश दिया पपड़ी। दुर्भाग्यवश, वह वह चीज़ नहीं थी जिसे वह चाहता था। इसके अलावा, मशरूम, पेपरोनी और एन्कोवीज़ के साथ पिज्जा सामान्य पिज्जा से पतली परत पर पतली परत पर एन्कोवियों के साथ काफी बेहतर होता है।

क्या हुआ:

पहला मैच pizza with anchovies आखिरी मैच के समान है। इसलिए, String.replace का उपयोग करके पहला और अंतिम मैच pizza with anchovies on a thin crust में बदल गया। चूंकि, हम सभी मैचों के माध्यम से लूपिंग कर रहे हैं, अंतिम मैच अभी भी होगा और प्रतिस्थापन समारोह पहले मैच को भी बदल देगा (क्योंकि पहला मैच और अंतिम मैच समान है)। इसलिए, हमें डबल on a thin crust मिलता है।

प्रश्न:

वहाँ एक रास्ता केवल वर्तमान मैच में एक रेगुलर एक्सप्रेशन से मेल को बदलने के लिए है?

+0

यदि आपको मेरा उत्तर उपयोगी/आपके लिए काम मिल रहा है, तो कृपया ऊपर उठाने/स्वीकार करने पर विचार करें। –

उत्तर

6

एक भी replaceAll पूरे मैच के लिए $0 backreference उपयोग करने के साथ इसे अभी करें:

String s = "He ordered a pizza with anchovies. Unfortunately, it wasn't the thing he wanted. Besides, pizza with mushroom, pepperoni and anchovies is much better than the normal pizza with anchovies."; 
s = s.replaceAll("(?i)pizza with [a-zA-Z,\\s]*?anchovies", "$0 on a thin crust"); 
System.out.println(s); 
// => He ordered a pizza with anchovies on a thin crust. Unfortunately, it wasn't the thing 
// he wanted. Besides, pizza with mushroom, pepperoni and anchovies on a thin crust is 
// much better than the normal pizza with anchovies on a thin crust. 

Java demo

इस तरह देखें, तो आप replaceAll() प्रक्रिया सब, कई, गैर के बाद से पहले से ही जगह ग्रंथों की जगह से दूर रहेंगे आपके रेगेक्स पैटर्न को पूरा करने वाले सबस्ट्रिंग्स की ओवरलैपिंग घटनाएं।

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