स्ट्रिंग से विशेष वर्ण कैसे निकालें?


92

मैं विशेष वर्णों को हटाना चाहता हूं जैसे:

- + ^ . : ,

जावा का उपयोग करते हुए एक स्ट्रिंग से।


आप जाहिरा तौर पर पहले से ही जानते हैं कि एक regex इस पर आधारित है कि आपने अपने प्रश्न को कैसे टैग किया है। क्या आपने Stringकक्षा के लिए प्रलेखन पढ़ने की कोशिश की ? विशेष रूप से, 'रेगेक्स' शब्द की तलाश करें; कुछ तरीके हैं, और थोड़ा सा विचार आपको आगे बढ़ने का तरीका बताना चाहिए ... :)
कार्ल Knechtel

3
वाक्यांश "विशेष चरित्र" लगभग पूरी तरह से व्यर्थ होने के लिए अति प्रयोग किया जाता है। यदि आपका मतलब क्या है, "मेरे पास उन विशिष्ट पात्रों की सूची है जिन्हें मैं हटाना चाहता हूं," तब थॉमस सुझाव देते हैं और एक रेगेक्स चरित्र वर्ग के साथ अपना पैटर्न बनाते हैं और replaceAllउन्हें दूर करते हैं। यदि आपके पास अधिक गूढ़ आवश्यकताएं हैं, तो प्रश्न को संपादित करें। :)
रे तोल

1
वे विशेष वर्ण नहीं हैं ... ये हैं: äâêíèéè चूंकि वे आपके सामान्य 1-बाइट वर्ण प्रकार नहीं हैं - जैसे + ^ हैं ... वैसे भी, जैसा कि रे ने कहा, या तो replaceAllउनके लिए करें, या, एक पार्स करें स्ट्रिंग, उन वर्णों को जोड़ें जो आपके द्वारा किसी अन्य स्ट्रिंग को बाहर निकालने के लिए किए गए चार्ट नहीं हैं और अंत में आप जिस स्ट्रिंग पर लौट रहे हैं, उसके लिए a = = करें।
गोंकेलो विएरा

deleteChars.apply( fromString, "-+^.:," );- खोज यहाँ deleteChars
कापलान

जवाबों:


258

यह इस बात पर निर्भर करता है कि आप विशेष पात्रों के रूप में क्या परिभाषित करते हैं, लेकिन कोशिश करें replaceAll(...):

String result = yourString.replaceAll("[-+.^:,]","");

ध्यान दें कि सूची में ^वर्ण पहले वाला नहीं होना चाहिए, क्योंकि तब आपको या तो इससे बचना होगा या इसका अर्थ होगा "कोई भी लेकिन ये वर्ण"।

एक और नोट: -चरित्र अन्यथा आप इसे से बचने के लिए होगा या यह एक सीमा को परिभाषित करेगा (उदाहरण के लिए सूची में पहले या पिछले एक होने की जरूरत है, :-,"श्रेणी में सभी पात्रों का मतलब होगा :करने के लिए ,)।

तो, क्रम स्थिरता रखने के लिए और नहीं चरित्र स्थिति पर निर्भर करते हैं, तो आप उन सभी अक्षर हैं जो नियमित अभिव्यक्ति में एक विशेष अर्थ नहीं होता बचने के लिए चाहते हो सकता है (निम्न सूची पूरी नहीं है, तो अन्य पात्रों के बारे में पता होना है की तरह (, {, $ आदि) :

String result = yourString.replaceAll("[\\-\\+\\.\\^:,]","");


यदि आप सभी विराम चिह्नों और प्रतीकों से छुटकारा पाना चाहते हैं, तो इस regex को आज़माएं: \p{P}\p{S}(ध्यान रखें कि जावा स्ट्रिंग्स में आपको बैक स्लैश से बचना होगा:) "\\p{P}\\p{S}"

तीसरा तरीका कुछ इस तरह का हो सकता है, अगर आप ठीक से परिभाषित कर सकते हैं कि आपके तार में क्या छोड़ा जाना चाहिए:

String  result = yourString.replaceAll("[^\\w\\s]","");

इसका मतलब है: हर उस चीज़ को बदलें जो एक शब्द चरित्र नहीं है (किसी भी मामले में az, 0-9 या _) या व्हाट्सएप।

संपादित करें: कृपया ध्यान दें कि कुछ अन्य पैटर्न हैं जो मददगार साबित हो सकते हैं। हालाँकि, मैं उन सभी को समझा नहीं सकता, इसलिए नियमित-expressions.info के संदर्भ अनुभाग पर एक नज़र डालें

यहाँ रे द्वारा सुझाए गए "परिभाषित वर्णों" दृष्टिकोण के लिए कम प्रतिबंधात्मक विकल्प है:

String  result = yourString.replaceAll("[^\\p{L}\\p{Z}]","");

रेगेक्स सब कुछ से मेल खाता है जो किसी भी भाषा में एक अक्षर नहीं है और न ही एक विभाजक (व्हाट्सएप, लाइनब्रेक आदि) है। ध्यान दें कि आप उपयोग नहीं कर सकते हैं [\P{L}\P{Z}](ऊपरी स्थिति पी का मतलब है कि संपत्ति नहीं है), क्योंकि इसका मतलब होगा "सब कुछ जो एक पत्र नहीं है या व्हाट्सएप नहीं है", जो लगभग सब कुछ मेल खाता है, क्योंकि पत्र व्हाट्सएप और इसके विपरीत नहीं हैं।

यूनिकोड पर अतिरिक्त जानकारी

कुछ यूनिकोड वर्णों के अलग-अलग तरीकों से उन्हें सांकेतिक शब्दों में बदलना (एकल कोड बिंदु या कोड बिंदुओं के संयोजन) के कारण समस्याएँ उत्पन्न होती हैं। अधिक जानकारी के लिए कृपया regular-expressions.info देखें।


सबसे अच्छा सामान्य प्रयोजन समाधान के लिए +1। चूंकि आप ओपी से विवरणों के अभाव में कुछ बदलाव कर रहे हैं, इसलिए आप ठीक-ठीक बता सकते हैं जैसे[\P{L}]
रे तोल

यह भी ध्यान दें कि सूची में -चरित्र पहले या अंतिम होना चाहिए या उसे बचना चाहिए।
केपेक्स

[^\\p{L}\\p{Z}]लगता है जर्मन Umlauts (ä, ö, ü) को खत्म करने के लिए (कम से कम यह मेरे लिए ऐसा करता है: /), इसलिए "रेगेक्स सब कुछ मेल खाता है जो किसी भी भाषा में एक अक्षर नहीं है" 100% सही नहीं लगता
पीटर

@ यह मेरे परीक्षणों में उन पात्रों को समाप्त नहीं करता है। आपके मामले में एक और समस्या हो सकती है, उदाहरण के लिए पाठ का एक अलग एन्कोडिंग। मैं अधिक जानकारी के लिए एक लिंक जोड़ूंगा।
थॉमस

1
@ तोमास String result = yourString.replaceAll("[^\w\s]","");त्रुटि करता हैInvalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )
विसुथ


18

जैसा कि यहां बताया गया है http://developer.android.com/reference/java/util/regex/Pattern.html

पैटर्न नियमित अभिव्यक्ति संकलित हैं। कई मामलों में, इस तरह के रूप में सुविधा के तरीके String.matches, String.replaceAllऔर String.splitबेहतर होगा, लेकिन अगर आपको एक ही नियमित अभिव्यक्ति के साथ बहुत सारे काम करने की आवश्यकता है, तो इसे एक बार संकलित करने और पुन: उपयोग करने के लिए अधिक कुशल हो सकता है। पैटर्न वर्ग और उसके साथी, माचिस, स्ट्रिंग द्वारा उजागर की गई छोटी राशि की तुलना में अधिक कार्यक्षमता भी प्रदान करते हैं।

public class RegularExpressionTest {

public static void main(String[] args) {
    System.out.println("String is = "+getOnlyStrings("!&(*^*(^(+one(&(^()(*)(*&^%$#@!#$%^&*()("));
    System.out.println("Number is = "+getOnlyDigits("&(*^*(^(+91-&*9hi-639-0097(&(^("));
}

 public static String getOnlyDigits(String s) {
    Pattern pattern = Pattern.compile("[^0-9]");
    Matcher matcher = pattern.matcher(s);
    String number = matcher.replaceAll("");
    return number;
 }
 public static String getOnlyStrings(String s) {
    Pattern pattern = Pattern.compile("[^a-z A-Z]");
    Matcher matcher = pattern.matcher(s);
    String number = matcher.replaceAll("");
    return number;
 }
}

परिणाम

String is = one
Number is = 9196390097

यह अरबी वर्णों को हटा देगा
S0haib Nasir

15

कक्षा replaceAll()की विधि का प्रयास करें String

BTW यहाँ विधि, वापसी प्रकार और पैरामीटर है।

public String replaceAll(String regex,
                         String replacement)

उदाहरण:

String str = "Hello +-^ my + - friends ^ ^^-- ^^^ +!";
str = str.replaceAll("[-+^]*", "");

इसे सभी {'^', '+', '-'} वर्णों को हटा देना चाहिए जिन्हें आप हटाना चाहते थे!


6

विशेष चरित्र को हटाने के लिए

String t2 = "!@#$%^&*()-';,./?><+abdd";

t2 = t2.replaceAll("\\W+","");

आउटपुट होगा: abdd.

यह पूरी तरह से काम करता है।


1
स्ट्रिंग शाब्दिक में अवैध बच चरित्र मिलेगा
जॉन जो

यह रिक्त स्थान भी हटा देगा यदि आप रिक्त स्थान रखना चाहते हैं तो t2 = t2.replaceAll का उपयोग करें ("[^ ^ \\ w \\ s]", "");
इसुरु दिलशान


1

आप निम्नानुसार एकल चार को हटा सकते हैं:

String str="+919595354336";

 String result = str.replaceAll("\\\\+","");

 System.out.println(result);

उत्पादन:

919595354336

0

यदि आप सिर्फ जावा में शाब्दिक प्रतिस्थापन करना चाहते हैं, तो Pattern.quote(string)किसी भी स्ट्रिंग को शाब्दिक रूप से बचने के लिए उपयोग करें।

myString.replaceAll(Pattern.quote(matchingStr), replacementStr)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.