अगर रेगेक्स का उपयोग करके कोई रेखा खाली है तो कैसे जांचें


154

मैं सरल रीगेक्स बनाने की कोशिश कर रहा हूं जो जांच करेगा कि कोई रेखा खाली है या नहीं।

मामला;

"    some"   // not blank
"   " //blank
"" // blank

यहां ब्लैंक का मतलब है जो आप अर्थ हैं। एक लाइन में व्हॉट्सएप भरा होता है या एक लाइन में कुछ नहीं होता है। यदि आप एक पंक्ति से मेल खाना चाहते हैं जिसमें कुछ भी नहीं है तो '^ ^ $ /' का प्रयोग करें
बद्री जीएस

जवाबों:


329

पैटर्न जो आप चाहते हैं वह कुछ इस तरह है मल्टीलाइन मोड में:

^\s*$

स्पष्टीकरण:

  • ^ स्ट्रिंग एंकर की शुरुआत है।
  • $ स्ट्रिंग एंकर का अंत है।
  • \s व्हाट्सएप चरित्र वर्ग है।
  • * का शून्य या अधिक दोहराव है।

मल्टीलाइन मोड में, ^और $लाइन की शुरुआत और अंत से भी मेल खाते हैं।

संदर्भ:


एक गैर-रेगेक्स विकल्प:

आप यह भी देख सकते हैं कि क्या एक दी गई स्ट्रिंग line"रिक्त" है (यानी केवल व्हॉट्सएप वाले) trim()इसे-करके, फिर परिणामी स्ट्रिंग की जाँच करें isEmpty()

जावा में, यह कुछ इस तरह होगा:

if (line.trim().isEmpty()) {
    // line is "blank"
}

एंकर के बिना रेगेक्स समाधान को भी सरल बनाया जा सकता है (क्योंकि matchesजावा में कैसे परिभाषित किया गया है) निम्नानुसार है:

if (line.matches("\\s*")) {
    // line is "blank"
}

एपीआई संदर्भ

  • String String.trim()
    • स्ट्रिंग की एक प्रतिलिपि लौटाता है, जिसके साथ व्हाट्सएप लोप हो जाता है।
  • boolean String.isEmpty()
    • रिटर्न trueअगर और वह भी तब, length()है 0
  • boolean String.matches(String regex)
    • बताता है कि यह (पूरी) स्ट्रिंग दी गई नियमित अभिव्यक्ति से मेल खाती है या नहीं ।

1
@ अदनान: मार्सेलो के जवाब में बार्ट की टिप्पणी पर ध्यान दें; आप कई रिक्त लाइनों को कैसे संभालना चाहते हैं, इसके आधार पर पैटर्न थोड़ा बदल सकता है।
पॉलीजेन लुब्रीकेंट

वैसे मैं जावा से एक फाइल पढ़ रहा हूं, लाइन से लाइन, इसलिए मैं मानता हूं कि यह ठीक होगा।
अदनान

1
यह लाइन के साथ शानदार लगता है। श्रीमंत: D
Adnan

1
उत्कृष्ट कोड अब 1.6sec से 1sec तक निष्पादित होता है। धन्यवाद।
अदनान

अजगर में: if line.strip(): चूंकि एक खाली स्ट्रिंग का मूल्यांकन किया जाता हैFalse
जॉन मार्क

58

वास्तव में मल्टीलाइन मोड में एक अधिक सही उत्तर यह है:

/((\r\n|\n|\r)$)|(^(\r\n|\n|\r))|^\s*$/gm

स्वीकृत उत्तर: ^\s*$अंतिम पंक्ति के खाली होने पर (मल्टीलाइन मोड में) एक परिदृश्य से मेल नहीं खाता।


वास्तव में, और मैंने पुष्टि की कि यह मामला है। स्वीकृत उत्तर ने मेरी फ़ाइल में कई खाली लाइनें याद कीं, लेकिन इसने उन सभी को पकड़ लिया। दोनों regexes का संघ हर मामले को पकड़ता है।
एलमोर

1
इस उत्तर ने नोटपैड ++ जैसे टूल में पूरी तरह से काम किया। स्वीकृत उत्तर कई खाली लाइनों से मेल खाता है लेकिन एक भी खाली लाइनें नहीं है।
james

मेरे मामले में, स्वीकृत उत्तर उदात्त पाठ 3 में काम नहीं करता है, और यह काम करता है।
यंगसिबाई

1
स्वीकृत उत्तर ने मेरे मामले, बहुस्तरीय के लिए काम किया। यह करता है।
रॉबर्ट गैब्रियल

1
यह सबसे अच्छा जवाब होना चाहिए।
क्यू मैं

12

इसे इस्तेमाल करे:

^\s*$

5
@ अदनान, ध्यान दें कि \sलाइन टूटने से भी मेल खाती है, इसलिए आप एक स्ट्रिंग के अंदर "खाली" क्रमिक खाली लाइनों वाले "नहीं" पाएंगे।
बार्ट कीर्स

6

सबसे पोर्टेबल regex होगा ^[ \t\n]*$कोई रिक्त स्ट्रिंग (ध्यान दें कि आप को बदलने के लिए की आवश्यकता होगी मैच के लिए \tऔर \nटैब और न्यू लाइन तदनुसार के साथ) और [^ \n\t]एक गैर-सफ़ेद स्ट्रिंग के मिलान।


मैं कम से कम सिंगल स्पेस को क्लास के साथ बदल देता हूँ[ \t]
बार्ट कीर्स

1
विंडोज पर आपको गाड़ी वापसी चरित्र पर भी विचार करने की आवश्यकता है \rताकि रेगेक्स होगा ^[ \t\r\n]*$। लेकिन ^\s*$बेहतर है - अधिक संक्षिप्त। यदि आप newlines से मेल नहीं खाना चाहते हैं, तो आप \h(जिसका अर्थ है क्षैतिज ^\h*$
व्हाट्सएप

5

इस जवाब के लिए bchr02 को पूरा श्रेय । हालाँकि, मुझे खाली लाइन द्वारा अनुसरण की जाने वाली लाइनों (टिप्पणी का अंत) के लिए परिदृश्य को पकड़ने के लिए इसे थोड़ा संशोधित करना पड़ा । रेगेक्स के साथ गैर रिक्त रेखा का मिलान किया गया था ।*/*/

नया: (^(\r\n|\n|\r)$)|(^(\r\n|\n|\r))|^\s*$/gm

मैंने जो भी किया वह ^पंक्ति की शुरुआत को दर्शाने के लिए दूसरे चरित्र के रूप में जोड़ा गया।


Bchr02 के उत्तर पर टिप्पणी क्यों न करें और उसके उत्तर में सुधार का सुझाव दें?
adamlogan

1
@adamlogan हाँ, स्मृति से, मुझे लगता है कि मैं उस समय करना चाहता था, लेकिन मेरे पास किसी और की पोस्ट पर टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा नहीं थी, इसलिए मुझे ऐसा करना पड़ा।
जॉन हेनरी

3

यहां ब्लैंक का मतलब है जो आप अर्थ हैं।
एक लाइन में व्हॉट्सएप भरा होता है या एक लाइन में कुछ नहीं होता है।
यदि आप एक पंक्ति से मेल खाना चाहते हैं जिसमें कुछ भी नहीं है तो '/ ^ $ /' का उपयोग करें।


-1

खैर ... मैं (नोटपैड + का उपयोग करके) के आसपास छेड़छाड़ की और यह वह समाधान है जो मैंने पाया

\ N \ रों

पंक्ति के अंत के लिए \ n (जहाँ आप मेल खाना शुरू करते हैं) - मेरे मामले में कैरेट की मदद नहीं होगी क्योंकि पंक्ति की शुरुआत एक स्ट्रिंग है \ n अगली स्ट्रिंग तक कोई स्थान नहीं लेता है

आशा करता हूँ की ये काम करेगा


ओपी एक रेक्सक्स उत्तर चाहता है, जो दिया गया था, और नई लाइन वर्णों के बारे में नहीं है।
मूडी_मडस्किपर

उपयोगकर्ता "सरल रेगेक्स के लिए पूछता है जो यह जांच करेगा कि क्या कोई रेखा रिक्त है" आप इसे क्यों नहीं परीक्षण करते हैं?
M_TRONIC

आर का उपयोग कर, हमारे परीक्षण वेक्टर test_vec <- c(" some"," ",""):। आपका समाधान:, grepl("\\n\\s",test_vec) # [1] FALSE FALSE FALSEमतदान समाधान grepl("^\\s*$",test_vec) # [1] FALSE TRUE TRUE:। मतदान समाधान अपेक्षित परिणाम देता है, आपका नहीं।
मूडी_मडस्किपर

जैसे मैंने कहा कि मैंने नोटपैड ++ पर इसका इस्तेमाल किया और यह काम कर गया। तुम्हारा नहीं था। इसलिए मुझे लगता है कि हम असहमत सहमत हो सकते हैं!
M_TRONIC

मुझे यकीन नहीं है कि आप हालांकि क्या कर रहे हैं, क्या आप ctrl+fनोटपैड ++ में कर रहे हैं ? इस स्थिति में आप "विस्तारित" खोज मोड का चयन करके और '\ n \ _' की खोज करके रिक्त लाइनों को (हालांकि मिलान नहीं कर सकते हैं), यदि आप "नियमित अभिव्यक्ति" का चयन करते हैं, तो आपका स्ट्रिंग उसी से मेल खाएगा, और आप कर सकते हैं यह भी कोशिश करें कि @polygenelubricants का समाधान। उत्तरार्द्ध वास्तव में रेखा से मेल खाएगा, आप अंतर की जांच कर सकते हैं और देख सकते हैं। मेरा सुझाव है कि आप जो सलाह दे रहे हैं उसके बारे में अधिक स्पष्ट होने के लिए अपने उत्तर को संपादित करें, ताकि पाठक अधिक मूल्य ले सकें। यह।
मूडी_मडस्किपर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.