जावा में Regex अभिव्यक्तियाँ, \\ s बनाम \\ s +


96

निम्नलिखित दो भावों में क्या अंतर है?

x = x.replaceAll("\\s", "");
x = x.replaceAll("\\s+", "");

3
क्वांटिफायर, उन पर पढ़ा।
jn1kk

जवाबों:


88

पहला एक एकल व्हाट्सएप से मेल खाता है, जबकि दूसरा एक व्हाट्सएप से मेल खाता है। वे तथाकथित नियमित अभिव्यक्ति क्वांटिफायर हैं, और वे इस तरह से मैच करते हैं ( प्रलेखन से लिया गया है ):

Greedy quantifiers
X?  X, once or not at all
X*  X, zero or more times
X+  X, one or more times
X{n}    X, exactly n times
X{n,}   X, at least n times
X{n,m}  X, at least n but not more than m times

Reluctant quantifiers
X?? X, once or not at all
X*? X, zero or more times
X+? X, one or more times
X{n}?   X, exactly n times
X{n,}?  X, at least n times
X{n,m}? X, at least n but not more than m times

Possessive quantifiers
X?+ X, once or not at all
X*+ X, zero or more times
X++ X, one or more times
X{n}+   X, exactly n times
X{n,}+  X, at least n times
X{n,m}+ X, at least n but not more than m times

20
मैंने हमेशा प्यार किया है कि वे प्रत्येक क्वांटिफायर के लालची, अनिच्छुक और अधिकारपूर्ण संस्करणों के अलग-अलग विवरण कैसे प्रदान करते हैं, और फिर सभी तीनों के बारे में एक ही बात कहते हैं। ;)
एलन मूर

60

वे दो replaceAllकॉल हमेशा उसी परिणाम का उत्पादन करेंगे, चाहे जो xभी हो। हालांकि, यह ध्यान रखना महत्वपूर्ण है कि दो नियमित अभिव्यक्ति समान नहीं हैं:

  • \\s - एकल व्हाट्सएप चरित्र से मेल खाता है
  • \\s+ - एक या अधिक व्हाट्सएप पात्रों के अनुक्रम से मेल खाता है।

इस मामले में, इससे कोई फर्क नहीं पड़ता है, क्योंकि आप सब कुछ एक खाली स्ट्रिंग के साथ बदल रहे हैं (हालांकि यह \\s+दक्षता के दृष्टिकोण से उपयोग करना बेहतर होगा )। यदि आप एक गैर-रिक्त स्ट्रिंग के साथ बदल रहे थे, तो दोनों अलग-अलग व्यवहार करेंगे।


अपनी पहली पंक्ति लिखें, अगर x "आपका डोमेन बुक करें और आज ऑनलाइन ऑनलाइन प्राप्त करें \ n \ n \ n \ n \ n \" क्या दोनों एक ही परिणाम देंगे?
sofs1

3
@ user3705478 दोनों एक ही परिणाम का उत्पादन करेंगे, भले ही एक दूसरे के बाद कई स्थान हों। यह अंतर उस तरह से निहित है जैसे इसे संभाला जाता है। यदि आपके पास एक समूह होगा (उदाहरण के लिए) 3 स्थान सीधे एक दूसरे का अनुसरण करते हुए \\ s + उस समूह को ले जाते हैं और पूरे को "" में बदल देते हैं, जबकि \\ s प्रत्येक स्थान को अपने आप ही जोड़ देगा।
डेनी

11

सबसे पहले आपको यह समझने की आवश्यकता है कि दिए गए स्ट्रिंग से सभी रिक्त स्थान को निकालने के लिए दोनों कथनों का अंतिम आउटपुट समान होगा।

हालांकि x.replaceAll("\\s+", "");ट्रिमिंग रिक्त स्थान का अधिक कुशल तरीका होगा (यदि स्ट्रिंग में कई सन्निहित स्थान हो सकते हैं) क्योंकि संभवतः इस तथ्य के कारण प्रतिस्थापन की कम संख्या होती है कि रेगेक्स \\s+एक बार में 1 या अधिक रिक्त स्थान से मेल खाता है और उन्हें रिक्त स्ट्रिंग से बदल देता है।

भले ही आप दोनों से एक ही आउटपुट प्राप्त करें, लेकिन इसका उपयोग करना बेहतर है:

x.replaceAll("\\s+", "");

2

पहला रेगेक्स एक व्हाट्सएप चरित्र से मेल खाएगा। दूसरा रेगेक्स अनिच्छा से एक या अधिक व्हाट्सएप पात्रों से मेल खाएगा। अधिकांश उद्देश्यों के लिए, ये दो रेगीक्स बहुत समान हैं, दूसरे मामले को छोड़कर, रेगेक्स स्ट्रिंग के अधिक मेल खा सकता है, अगर यह रेगेक्स मैच को विफल होने से रोकता है। से http://www.coderanch.com/t/570917/java/java/regex-difference


"अनिच्छा से" शब्द को स्क्रैच करें। यह प्रश्न इस बारे में है \s+, \s+?अन्य प्रश्न की तरह नहीं ।
एलन मूर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.