2015-05-26 14 views
5

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

String test = "###,##.##0.0########"; 
System.out.println(test); 
test = test.replaceAll("\\.0(#)", "0"); 
System.out.println(test); 

परिणाम मैं प्राप्त करने के लिए कोशिश कर रहा हूँ ###,##.##0.000000000 है असल में, मैं सभी # प्रतीकों कि .0 अनुगामी बदल भी सकते हैं। मुझे this about dynamic replacement मिला है लेकिन मैं वास्तव में इसे काम नहीं कर सकता।

इष्टतम समाधान खाते में हैश की संख्या को प्रतिस्थापित नहीं किया जाएगा (यदि यह किसी भी भ्रम को साफ़ करता है)।

+1

तो तुम सब '#' '' 0' के लिए निम्न .0' बदलना चाहते हैं? – npinti

+0

@npinti। हां, भ्रम के बारे में खेद है, मैंने स्पष्टीकरण जोड़ा है। – alkis

+0

'0' के साथ प्रतिस्थापित करने के लिए कितने हैश प्रतीक इनपुट स्ट्रिंग में हो सकते हैं? असीमित, या कहो, एक सौ? –

उत्तर

5

आप अपने कार्य को प्राप्त करने के लिए एक सरल regex का उपयोग कर सकते हैं।

#(?=#*+$) 

(?=#*+$) एक सकारात्मक look-ahead है कि किसी भी # कि स्ट्रिंग $ के अंत से पहले 0 या अधिक # प्रतीकों से पहले किया जाता है के लिए जाँच करता =। संपादित करें: अब मैं किसी प्रदर्शन प्रदर्शन से बचने के लिए possessive quantifier*+ का उपयोग कर रहा हूं।

demo

IDEONE देखें:

String test = "###,##.##0.0###########################################"; 
test = test.replaceAll("#(?=#*+$)", "0"); 
System.out.println(test); 
+0

ग्रेट समाधान और स्पष्टीकरण के लिए धन्यवाद। बेशक upvoted – alkis

+1

मदद करने के लिए खुशी हुई। मुझे यह भी लगता है कि आप स्वामित्व वाले क्वांटिफ़ायर का उपयोग करके इसे और भी अनुकूलित कर सकते हैं: '# (? = # * + $)'। मैंने जवाब संपादित किया। –

+0

प्रदर्शन यहां कोई मुद्दा नहीं है क्योंकि हम छोटे तारों के बारे में बात कर रहे हैं, लेकिन फिर भी, अंतर जानने के लिए बहुत अच्छा है। क्या रेगेक्स ऑपरेशन चरणबद्ध तरीके से व्याख्या करना संभव है? यद्यपि उत्तर मेरी समस्या का समाधान करते हैं, लेकिन अगर सामग्री मौजूद थी तो यह बहुत अच्छा होगा (मछली को किसी को सिखाएं ...) – alkis

7
#(?!.*\\.0) 

आप इसे आजमा सकते हैं। 0 द्वारा बदलें। डेमो देखें।

https://regex101.com/r/yW3oJ9/12

+0

यदि मैं सही ढंग से समझता हूं, तो यह इस तरह से जाता है: प्रत्येक '#' को बदलें, लेकिन पहले से '0' सब कुछ छोड़ दें। क्या आप '?!' समझा सकते हैं? – alkis

+0

@alkis '?! नकारात्मक दिखने वाला है। यह प्रत्येक' # 'को प्रतिस्थापित करेगा जिसमें इसके आगे' .0' नहीं है। – vks

2

आप "0.0" पर अपने पाठ विभाजित है और सिर्फ दूसरे भाग के लिए जगह ले सकता है:

String[] splited = "###,##.##0.0########".split("0.0"); 
String finalString = splited[0] + "0.0" + splited[1].replaceAll("#","0"); 
+0

मैं एक रेगेक्स समाधान पसंद करते हैं। क्षमा करें अगर मैं पर्याप्त स्पष्ट नहीं था। यद्यपि यह वैध है, तो ऊपर उठाया गया है। – alkis