मैं कैसे जांचूं कि एक जावा स्ट्रिंग सभी व्हाट्सएप नहीं है?


132

मैं यह जाँचना चाहता हूं कि जावा स्ट्रिंग या कैरेक्टर ऐरे सिर्फ जावा का उपयोग करके व्हाट्सएप से बना नहीं है?

यह जावास्क्रिप्ट के अलावा एक बहुत ही समान प्रश्न है:
मैं कैसे जांच सकता हूं कि क्या स्ट्रिंग में वर्ण और व्हाट्सएप हैं, न कि सिर्फ व्हाट्सएप?

संपादित करें : मैंने अल्फ़ान्यूमेरिक वर्णों के बारे में थोड़ा हटा दिया है, इसलिए यह अधिक समझ में आता है।


3
इस बात से अवगत रहें कि व्हॉट्सएप की कई अलग-अलग परिभाषाएँ हैं: स्प्रेडशीट । या फिर आप कहते हैं "एक अल्फ़ान्यूमेरिक वर्ण है", जो एक पूरी तरह से अलग बात है। कृपया स्पष्ट करें।
केविन बोर्रिलिन

भ्रम के लिए क्षमा याचना ... सभी व्हाट्सएप की कुंजी नहीं है- मूल रूप से अगर इसमें सभी व्हाट्सएप चरित्र हैं जिन्हें मैं इसे बाहर करना चाहता हूं, क्योंकि इसमें कोई सामग्री नहीं है।
अंकुर

1
JDK / 11 से आप उसी के लिए एपीआई का उपयोगString.isBlank कर सकते हैं
नमन

जवाबों:


224

सबसे छोटा उपाय जो मैं सोच सकता हूं:

if (string.trim().length() > 0) ...

यह केवल (गैर) सफेद स्थान की जांच करता है। यदि आप विशेष वर्ण वर्गों के लिए जाँच करना चाहते हैं, तो आपको match()ताकत का उपयोग एक rexxp के साथ करने की आवश्यकता है जैसे:

if (string.matches(".*\\w.*")) ...

... जो कम से कम एक (ASCII) अल्फ़ान्यूमेरिक वर्ण की जाँच करता है।


9
FWIW: मैं उम्मीद करता हूं कि पहला समाधान काफी तेजी से होगा।
स्टीफन सी

2
@ स्टीफन सी: बिल्कुल! लेकिन जैसा कि @Uri ने कहा, मुझे सवाल की अस्पष्टता के लिए धन्यवाद दो अलग-अलग समस्याओं को हल करना है :) इसके अलावा, मैं शायद ही कभी उपयोग करता हूं matches(): प्रदर्शन के लिए, मैं आमतौर पर Patternए में स्टोर करता हूं final static। यदि समान कोड अक्सर चलता है तो बंद हो जाता है।
बजे कार्ल स्मोत्रिकज़

3
@Andreas_D: हे, मुझे अपने आदेश मिले! ओपी ने कहा कि वह एक स्ट्रिंग या चार सरणी की जांच करना चाहता था, उसने कभी भी नल के बारे में कुछ नहीं कहा! :) * अनुबंध में ठीक प्रिंट की जाँच करता है * " nullएक स्ट्रिंग नहीं है!"
कार्ल स्मोत्रिकज़

1
इसके अलावा, "\\ w" केवल सभी गैर-व्हाट्सएप के बजाय गैर-व्हाट्सएप वर्णों के एक सीमित उपसमूह से मेल खाता है क्योंकि यह AZ, az, 0-9 और अंडरस्कोर के रूप में परिभाषित "शब्द वर्ण" को संदर्भित करता है।
रॉब राइस

2
मैंने your_string.trim () .EEmpty () का उपयोग किया और मेरे लिए काम किया
नेरी

59

मैं अपाचे कॉमन्स लैंग लाइब्रेरी का उपयोग करूंगा। इसके पास एक वर्ग है, जिसे StringUtils कहा जाता है, जो सभी प्रकार के String संचालन के लिए उपयोगी है। जाँच करने के लिए कि क्या एक स्ट्रिंग सभी व्हाट्सएप नहीं है, आप निम्नलिखित का उपयोग कर सकते हैं:

StringUtils.isBlank(<your string>)

यहाँ संदर्भ है: StringUtils.isBlank


8
मैं चुने हुए उत्तर का उपयोग करने की तुलना में इस समाधान को पसंद करता हूं। यह स्ट्रिंग के लिए भी जांच करेगा == अशक्त
रिचर्ड

यह अब गलत है। StringUtils.isEmptyयदि आप "" में पास हो जाते हैं तो अब गलत हो जाएगा।
जेम्स स्पैन

53

कार्ल स्मोत्रिकेज़ द्वारा उल्लिखित की तुलना में थोड़ा कम:

!string.trim().isEmpty();

10
आप युवा व्हिपसैन्पर और अपने नए-नवेले पोस्ट-जावा-1.6 छल! गंभीरता से, मेरी कंपनी में कम से कम एक परियोजना अभी भी जावा 1.4 (sigh) पर चलती है।
कार्ल स्मोत्रिकज़

छोटा? हाँ। व्यक्तिगत रूप से, मुझे और अधिक वर्बोज़ कोडिंग शैली पसंद है
मिशेल


9

यदि आप जावा 11 का उपयोग कर रहे हैं , तो नई isBlankस्ट्रिंग विधि काम आएगी:

!s.isBlank();

यदि आप जावा 8, 9 या 10 का उपयोग कर रहे हैं , तो आप यह जांचने के लिए एक सरल स्ट्रीम बना सकते हैं कि एक स्ट्रिंग केवल व्हाट्सएप नहीं है:

!s.chars().allMatch(Character::isWhitespace));

अपाचे कॉमन्स लैंग जैसे किसी भी तीसरे पक्ष के पुस्तकालयों की आवश्यकता नहीं होने के अलावा, इन समाधानों में किसी भी सफेद अंतरिक्ष चरित्र को संभालने का लाभ है, और न केवल सादे ' 'रिक्त स्थान के रूप में एक- trimआधारित समाधान कई अन्य उत्तरों में सुझाए गए हैं। आप सभी समर्थित सफेद स्थान प्रकारों की विस्तृत सूची के लिए Javadocs का उल्लेख कर सकते हैं । ध्यान दें कि दोनों मामलों में खाली तार भी कवर किए गए हैं।


5
if(target.matches("\\S")) 
    // then string contains at least one non-whitespace character

बैक-स्लैश कैप-एस के उपयोग पर ध्यान दें, जिसका अर्थ है "गैर-व्हाट्सएप चार"

मैं दांव लगाना होगा यह सबसे सरल (और शायद सबसे तेज़?) समाधान है।


2
चलो कोशिश करें: String year="1995"; year.matches("\\S"); will return falseतो यह सही समाधान नहीं है। : |
हाट दिन्ह

6
हालांकि, आप सही हैं कि मैं क्यों समझा रहा हूं। जावा डॉक्स के अनुसार, String.matches यह देखने के लिए जांचता है कि क्या दिए गए स्ट्रिंग एक रेक्स से मेल खाते हैं। थोड़ा सा प्रयोग दिखाता है कि यह पूरी तरह से सही नहीं है, क्योंकि यह फ़ंक्शन केवल मैच के लिए प्रतीत होता है यदि प्रदान किया गया रेग्जीन एनटीईआरआई स्ट्रिंग से मेल खाता है! तो, ऊपर रेगेक्स ("\\ S") को बदलकर "^। * \\ S। रेगुलर एक्सप्रेशंस का उपयोग करना।
रोब रईस

4

यह उत्तर सिडेनोट पर अधिक ध्यान केंद्रित करता है "" में कम से कम एक अल्फ़ान्यूमेरिक चरित्र है "। इसके अलावा, यह दूसरे (पहले) समाधान के लिए बहुत अधिक नहीं जोड़ता है, सिवाय इसके कि स्ट्रिंग के होने की स्थिति में यह आपको एनपीई के साथ चोट नहीं पहुंचाता है null

हम चाहते हैं falseकि (1) s है nullया (2) s खाली है या (3) s में केवल श्वेतवर्ण हैं।

public static boolean containsNonWhitespaceChar(String s) {
  return !((s == null) || "".equals(s.trim()));
}

4

यदि आप केवल व्हाट्सएप के लिए जाँच कर रहे हैं और अशक्त की परवाह नहीं करते हैं तो आप org.apache.commons.lang.StringUtils.isWhitespace (स्ट्रिंग स्ट्रिंग) का उपयोग कर सकते हैं,

StringUtils.isWhitespace(String str);

(जाँचता है कि स्ट्रिंग में केवल व्हाट्सएप है।)

यदि आप अशक्त (व्हाट्सएप सहित) जांच करना चाहते हैं तो

StringUtils.isBlank(String str);

isBlank (स्ट्रिंग) की सिफारिश की जाती है क्योंकि यह अशक्त सत्यापन को भी संभालती है!
सचिदानंद नाइक

2

जावा -11 + के साथ, आप String.isBlankएपीआई का उपयोग यह जांचने के लिए कर सकते हैं कि क्या दिए गए तार सभी व्हाट्सएप से नहीं बने हैं -

String str1 = "    ";
System.out.println(str1.isBlank()); // made up of all whitespaces, prints true

String str2 = "    a";
System.out.println(str2.isBlank()); // prints false

उसी के लिए javadoc है:

/**
 * Returns {@code true} if the string is empty or contains only
 * {@link Character#isWhitespace(int) white space} codepoints,
 * otherwise {@code false}.
 *
 * @return {@code true} if the string is empty or contains only
 *         {@link Character#isWhitespace(int) white space} codepoints,
 *         otherwise {@code false}
 *
 * @since 11
 */
public boolean isBlank()

1

ट्रिम विधि आपके लिए बहुत अच्छा काम करना चाहिए।

http://download.oracle.com/docs/cd/E17476_01/javase/1.4.2/docs/api/java/lang/String.html#trim ()

स्ट्रिंग की एक प्रति लौटाता है, जिसके साथ अग्रणी और अनुगामी व्हाट्सएप छोड़ा जाता है। यदि यह स्ट्रिंग ऑब्जेक्ट एक खाली वर्ण अनुक्रम का प्रतिनिधित्व करता है, या इस स्ट्रिंग ऑब्जेक्ट द्वारा दर्शाए गए चरित्र अनुक्रम के पहले और अंतिम वर्णों में '\ u0020' (अंतरिक्ष वर्ण) से अधिक कोड होते हैं, तो इस स्ट्रिंग ऑब्जेक्ट का एक संदर्भ वापस आ जाता है।

अन्यथा, यदि स्ट्रिंग में '\ u0020' से अधिक कोड वाला कोई चरित्र नहीं है, तो एक खाली स्ट्रिंग का प्रतिनिधित्व करने वाला एक नया स्ट्रिंग ऑब्जेक्ट बनाया और वापस आ जाता है।

अन्यथा, k को स्ट्रिंग में पहले वर्ण का सूचकांक बनाते हैं, जिसका कोड '\ u0020' से अधिक है, और मैं स्ट्रिंग में अंतिम वर्ण का सूचकांक हूं जिसका कोड '\ u0020' से अधिक है। एक नया स्ट्रिंग ऑब्जेक्ट बनाया जाता है, जो इस स्ट्रिंग के प्रतिस्थापन का प्रतिनिधित्व करता है जो कि सूचकांक k पर वर्ण से शुरू होता है और सूचकांक m- यानी, इस के परिणाम के साथ समाप्त होता है। substring (k, m + 1)।

इस पद्धति का उपयोग एक स्ट्रिंग की शुरुआत और अंत से व्हाट्सएप ट्रिम करने के लिए किया जा सकता है; वास्तव में, यह सभी ASCII नियंत्रण वर्णों को भी प्रभावित करता है।

रिटर्न: इस स्ट्रिंग की एक कॉपी, जो सफेद स्थान को हटाती है और पीछे ले जाती है, या यह स्ट्रिंग, जिसके पास कोई सफेद या रिक्त स्थान नहीं है, या सफेद स्थान को पीछे छोड़ देता है।

आप ट्रिम कर सकते हैं और फिर एक खाली स्ट्रिंग की तुलना कर सकते हैं या संभवतः 0 की लंबाई की जांच कर सकते हैं।


उत्तर में लिंक मृत है - 404 | हमें खेद है, पृष्ठ मौजूद नहीं है या अब उपलब्ध नहीं है
पैंग

0

वैकल्पिक:

boolean isWhiteSpaces( String s ) {
    return s != null && s.matches("\\s+");
 }

1
\\ s * व्हॉट्सएप के साथ या बिना सभी तारों का मिलान करेगा। शायद आप \\ का मतलब है +?
रॉब रईस

0

ट्रिम () और अन्य उल्लिखित नियमित अभिव्यक्ति सभी प्रकार के व्हाट्सएप के लिए काम नहीं करती हैं

यानि: यूनिकोड कैरेक्टर 'LINE SEPARATOR' http://www.fileformat.info/info/unicode/char/2028/index.htm

Java फ़ंक्शन Character.isWhitespace () सभी स्थितियों को कवर करता है।

यही कारण है कि पहले से ही वर्णित समाधान StringUtils.isWhitespace (स्ट्रिंग) / या StringUtils.isBlank (स्ट्रिंग) का उपयोग किया जाना चाहिए।


0
StringUtils.isEmptyOrWhitespaceOnly(<your string>)

जाँच करेगा: - क्या यह शून्य है - क्या यह केवल स्थान है - क्या यह रिक्त स्ट्रिंग है ""

https://www.programcreek.com/java-api-examples/?class=com.mysql.jdbc.StringUtils&method=isEmptyOrWhitespaceOnly


1
क्या यह एक पुस्तकालय से है? प्रोजेक्ट का लिंक। या जावा में बनाया गया? पैकेज इंगित करें।
बेसिल बोर्क

@BasilBourque मुझे लगता है कि यह
com.mysql.jdbc.StringUtils.isEmptyOrWhitespaceOnly है

0

ओपनजीडीके 13, विंडोज 10 पर बस एक प्रदर्शन की तुलना

"abcd"
"    "
" \r\n\t"
" ab "
" \n\n\r\t   \n\r\t\t\t   \r\n\r\n\r\t \t\t\t\r\n\n"
"lorem ipsum dolor sit amet  consectetur adipisici elit"
"1234657891234567891324569871234567891326987132654798"

निम्नलिखित परीक्षणों में से एक निष्पादित:

// trim + empty
input.trim().isEmpty()

// simple match
input.matches("\\S")

// match with precompiled pattern
final Pattern PATTERN = Pattern.compile("\\S");
PATTERN.matcher(input).matches()

// java 11's isBlank
input.isBlank()

प्रत्येक 10.000.000 बार।

परिणाम:

METHOD    min   max   note
trim:      18   313   much slower if text not trimmed
match:   1799  2010   
pattern:  571   662   
isBlank:   60   338   faster the earlier hits the first non-whitespace character

काफी आश्चर्यजनक रूप से ट्रिम + खाली सबसे तेज है। भले ही इसके लिए छंटनी पाठ का निर्माण करना पड़े। फिर भी तेजी से एक एकल गैर-व्हाट्सएप चरित्र की तलाश में सरल लूप ...

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


0

जबकि व्यक्तिगत रूप से मैं पसंद कर रहा हूँ !str.isBlank(), जैसा कि पहले से ही दूसरों ने सुझाव दिया है (या str -> !str.isBlank()एक विधेय के रूप में), str.trim()ऊपर वर्णित दृष्टिकोण का एक और अधिक आधुनिक और कुशल संस्करण , का उपयोग किया जाएगा str.strip()- "व्हाट्सएप" के रूप में नल को देखते हुए :

if (str != null && str.strip().length() > 0) {...}

उदाहरण के लिए, एक इकाई परीक्षण में, धाराओं के साथ उपयोग के लिए, उदाहरण के लिए:

@Test
public void anyNonEmptyStrippedTest() {
    String[] strings = null;
    Predicate<String> isNonEmptyStripped = str -> str != null && str.strip().length() > 0;
    assertTrue(Optional.ofNullable(strings).map(arr -> Stream.of(arr).noneMatch(isNonEmptyStripped)).orElse(true));
    strings = new String[] { null, "", " ", "\\n", "\\t", "\\r" };
    assertTrue(Optional.ofNullable(strings).map(arr -> Stream.of(arr).anyMatch(isNonEmptyStripped)).orElse(true));
    strings = new String[] { null, "", " ", "\\n", "\\t", "\\r", "test" };
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.