2012-07-13 13 views
6

वहाँ केवल String.replaceAll(regex, replacement) विधि का उपयोग कर स्ट्रिंगजावा regexp समूहों प्रतिस्थापन

"m1, m2, m3" 
निम्नलिखित

"m1/build, m2/build, m3/build" 

को

को बदलने के लिए कोई तरीका है? आप देख सकते हैं उत्पादन गलत है

System.out.println("m1, m2, m3".replaceAll("([^,]*)", "$1/build")); 
>>> m1/build/build, m2/build/build, m3/build/build 

:

अभी तक यह मेरा सबसे अच्छा प्रयास है। हालांकि, लिनक्स के sed आदेश में एक ही regexp का उपयोग कर सही उत्पादन देता है:

echo 'm1, m2, m3' | sed -e 's%\([^,]*\)%\1/build%g' 
>>> m1/build, m2/build, m3/build 

उत्तर

4

([^,]*) रिक्त स्ट्रिंग मिलान कर सकते हैं, तो यह और भी दो स्थानों के बीच मिलान कर सकते हैं। ([^,]+) या (\w+) आज़माएं।

एक और नाबालिग टिप्पणी - आप $0 उपयोग कर सकते हैं पूरे मिलान किया स्ट्रिंग का उल्लेख करने, पर कब्जा कर लिया समूह से परहेज: (! काफी सचमुच)

System.out.println("m1, m2, m3".replaceAll("\\w+", "$0/build")); 
+0

+1 हाँ, यह समस्या प्रतीत होता है: http://ideone.com/omXQF – mellamokb

5

आप दूसरे छोर से समस्या को देखें, तो आप एक मिल अभिव्यक्ति जो सामग्री के बजाए टर्मिनेटर की तलाश में है। यह अभिव्यक्ति बहुत बेहतर काम करती है:

System.out.println("m1, m2, m3".replaceAll("(\\s*(,|$))", "/build$1")); 

यहां a link to this program on ideone है।

+0

इस तरह से मैं इसे करने की सोच रहा था। लेकिन क्या आपके पास/निर्माण और $ 1 स्वैप नहीं है? – BlackVegetable

+1

@BlackVegetable चूंकि मैं टर्मिनेटर से मेल खाता हूं, सामग्री नहीं, '$ 1' अंत में है। – dasblinkenlight

+0

हू, जानना अच्छा है! स्पष्ट करने के लिए आपको धन्यवाद। +1 – BlackVegetable

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