खाली तारों के साथ सभी गैर-अल्फ़ान्यूमेरिक वर्णों को बदलना


197

मैंने इसका उपयोग करने की कोशिश की, लेकिन काम नहीं किया-

return value.replaceAll("/[^A-Za-z0-9 ]/", "");

36
दोस्तों, आप भूल जाते हैं कि लैटिन के अलावा अन्य अक्षर हैं।
मतवाले

2
लेकिन अगर आप उदाहरण के लिए एक होस्टनाम को मान्य करना चाहते हैं, तो अमान्य वर्णमाला को बाहर करना अच्छा होगा।
गर्नार्ड

जवाबों:


245

का उपयोग करें [^A-Za-z0-9]

नोट: उस स्थान को हटा दिया गया है जो आमतौर पर अल्फ़ान्यूमेरिक नहीं माना जाता है।


10
न ही चरित्र वर्ग के अंत में स्थान होना चाहिए।
एंड्रयू डफी

6
वह शायद PHP में प्रोग्रामिंग करने के लिए उपयोग किया जाता है।
विलियम

10
@William - यह दुर्भाग्यपूर्ण है कि PHP को अब PCRE
थॉमस डिगन

reg एक्सपोज़ ठीक है, बस "/" को regexp स्ट्रिंग से value.replaceAll ("/ [^ A-Za-z0-9] /", "") से हटा दें; to value.replaceAll ("[^ A-Za-z0-9]", ""); आपको regexp के अंदर "/" की आवश्यकता नहीं है, मुझे लगता है कि आप जावास्क्रिप्ट पैटर्न के साथ भ्रमित हो गए हैं
eriknyk

128

प्रयत्न

return value.replaceAll("[^A-Za-z0-9]", "");

या

return value.replaceAll("[\\W]|_", "");

4
अंडरस्कोर के साथ,return value.replaceAll("\\W", "");
इरिकसन

बेशक। कंपाइलर उस तरह की जगह पर बहुत अच्छे हैं।
एंड्रयू डफी

1
दूसरा प्रश्न का उत्तर नहीं देता है। वर्णों के बारे में क्या: / \ etc?
डब्ल्यूडब्ल्यू।

67

आपको पता होना चाहिए कि [^a-zA-Z]चरित्र रेंज AZ / az में ही नहीं होने वाले वर्णों को बदल देगा। इसका मतलब है कि विशेष वर्ण जैसे é, ßआदि या सिरिलिक वर्ण और ऐसे हटा दिए जाएंगे।

यदि इन वर्णों के प्रतिस्थापन के बजाय पूर्व-निर्धारित वर्ण वर्गों का उपयोग नहीं करना चाहते हैं:

 str.replaceAll("[^\\p{IsAlphabetic}\\p{IsDigit}]", "");

पुनश्च: \p{Alnum}इस प्रभाव को प्राप्त नहीं करता है, यह उसी के रूप में कार्य करता है [A-Za-z0-9]


11
इस पोस्ट के लिए बहुत बहुत धन्यवाद - यह मेरे लिए बहुत उपयोगी था। इसके अतिरिक्त, मेरा मानना ​​है कि यह प्रश्न का वास्तविक उत्तर है। लैटिन वर्णमाला दुनिया में केवल एक ही नहीं है!
मटेवा

2
दरअसल, कथित रेगेक्स "^" को एक वैध चरित्र के रूप में मानेंगे, क्योंकि "^" की केवल पहली घटना चयन के अर्थ को नकार रही है। [^\\p{IsAlphabetic}\\p{IsDigit}]अच्छा काम करता है।
बोगडान क्लिचुक

1
@JakubTurcovsky docs.oracle.com/javase/10/docs/api/java/util/regex/Pattern.html IsAlphabetic और IsDigit को द्विआधारी गुणों के रूप में परिभाषित करता है। अल्फा और डिजिट POSIX वर्ण वर्ग (केवल US-ASCII) हैं। Docs.oracle.com/javase/10/docs/api/java/util/regex/… फ्लैग को छोड़कर ।
आंद्रे स्टिंग्रेस

@AndreSteingress सही, कारण {IsDigit}मेरे लिए काम नहीं {Digit}करता है और यह है कि मैं Android पर यह कोशिश कर रहा हूँ। और Android UNICODE_CHARACTER_CLASSडिफ़ॉल्ट रूप से चालू हो गया है। मंजूरी के लिए धन्यवाद।
जकुब तुरकोवस्की

केवल अल्फा, डिजिट और इमोजी की अनुमति कैसे दें?
रॉबर्ट गुडरिक

50
return value.replaceAll("[^A-Za-z0-9 ]", "");

यह रिक्त स्थान को छोड़ देगा । मुझे लगता है कि तुम क्या चाहते हो। अन्यथा, regex से स्थान निकालें।



10

/उदाहरण के लिए, पेरल जैसी अन्य भाषाओं के विपरीत, जावा के नियमित एक्सप्रेशंस में आपको फॉरवर्ड-स्लैश ( ) या रेगेक्स के आसपास किसी अन्य सीमांकक को डालने की आवश्यकता नहीं होती है ।


8

फ़ाइलनाम बनाने के लिए मैंने यह विधि बनाई:

public static String safeChar(String input)
{
    char[] allowed = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_".toCharArray();
    char[] charArray = input.toString().toCharArray();
    StringBuilder result = new StringBuilder();
    for (char c : charArray)
    {
        for (char a : allowed)
        {
            if(c==a) result.append(a);
        }
    }
    return result.toString();
}

5
यह बहुत क्रूर-बल है। ओपी की स्थिति के साथ जाने के लिए रेगेक्स रास्ता है।
माइकल पीटरसन

1
आप सही हैं, रेगेक्स बेहतर है। लेकिन उस समय, रेगेक्स और मुझे मैं साथ नहीं आए।
ज़ेनो

हह, क्या कोई वास्तव में रेगेक्स के साथ अच्छी तरह से मिलता है? ;)
माइकल पीटरसन

6

उपाय:

value.replaceAll("[^A-Za-z0-9]", "")

स्पष्टीकरण:

[^abc] जब ^वर्गाकार कोष्ठक कोष्ठक के अंदर पहले वर्ण के रूप में प्रकट होता है, तो यह पैटर्न को नकार देता है। यह पैटर्न किसी भी वर्ण को a या b या c को छोड़कर मेल खाता है

कीवर्ड को दो फ़ंक्शन के रूप में देख रहे हैं:

  • [(Pattern)] = match(Pattern)
  • [^(Pattern)] = notMatch(Pattern)

इसके अलावा एक पैटर्न के बारे में:

  • A-Z = all characters included from A to Z

  • a-z = all characters included from a to z

  • 0=9 = all characters included from 0 to 9

इसलिए यह पैटर्न में शामिल सभी चार को स्थानापन्न नहीं करेगा


3

यदि आप अल्फ़ान्यूमेरिक वर्णों को भी अनुमति देना चाहते हैं, जो कि एससीआई वर्णों से संबंधित नहीं हैं, उदाहरण के लिए, जर्मन ओम्लूट्स, तो आप निम्न समाधान का उपयोग करने पर विचार कर सकते हैं:

 String value = "your value";

 // this could be placed as a static final constant, so the compiling is only done once
 Pattern pattern = Pattern.compile("[^\\w]", Pattern.UNICODE_CHARACTER_CLASS);

 value = pattern.matcher(value).replaceAll("");

कृपया ध्यान दें कि UNICODE_CHARACTER_CLASS ध्वज का उपयोग प्रदर्शन दंड पर लागू हो सकता है (इस ध्वज का javadoc देखें)


1

सरल विधि:

public boolean isBlank(String value) {
    return (value == null || value.equals("") || value.equals("null") || value.trim().equals(""));
}

public String normalizeOnlyLettersNumbers(String str) {
    if (!isBlank(str)) {
        return str.replaceAll("[^\\p{L}\\p{Nd}]+", "");
    } else {
        return "";
    }
}


1

अमरूद के उपयोग से आप विभिन्न प्रकार के मानदंड आसानी से जोड़ सकते हैं। अपने विशिष्ट समाधान के लिए आप इसका उपयोग कर सकते हैं:

value = CharMatcher.inRange('0', '9')
        .or(CharMatcher.inRange('a', 'z')
        .or(CharMatcher.inRange('A', 'Z'))).retainFrom(value)

1

अमरूद का चारचैमर एक संक्षिप्त समाधान प्रदान करता है:

output = CharMatcher.javaLetterOrDigit().retainFrom(input);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.