सवाल सभी विशेष पात्रों की सूची जिन्हें रेगेक्स में भागने की आवश्यकता है


मैं एक ऐसा एप्लिकेशन बनाने की कोशिश कर रहा हूं जो एक संदेश टेम्पलेट से मेल खाता है जिसमें कोई संदेश भेजने का प्रयास कर रहा है। मैं संदेश से मेल खाने के लिए जावा रेगेक्स का उपयोग कर रहा हूं। टेम्पलेट / संदेश में विशेष वर्ण हो सकते हैं।

मेरे रेगेक्स को काम करने और अधिकतम संभावित मामलों में मेल खाने के लिए मुझे उन विशेष पात्रों की पूरी सूची कैसे प्राप्त की जाएगी जिन्हें बचने की आवश्यकता है?

जावा regex में सभी विशेष पात्रों से बचने के लिए एक सार्वभौमिक समाधान है?


76
2018-01-03 07:14


मूल




जवाब:


आप पैटर्न वर्ग के जावाडोक को देख सकते हैं: http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html

यदि आप नियमित रूप से चाहते हैं और विशेष अर्थ नहीं चाहते हैं तो आपको वहां सूचीबद्ध किसी भी चार से बचने की जरूरत है।

एक आसान समाधान के रूप में, आप टेम्पलेट को \ Q और \ E के बीच रख सकते हैं - उनके बीच की हर चीज़ को बच निकला माना जाता है।


63
2018-01-03 07:44



यदि आपको याद रखने के लिए \ Q और \ E मुश्किल लगता है तो आप इसके बजाय Pattern.quote ("...") का उपयोग कर सकते हैं - mkdev
काश आप वास्तव में उन्हें बताया था - Aleksandr Dubinsky
क्यों, @AleksandrDubinsky? - Sorin
@ सोरीन क्योंकि यह ऑफ-साइट संसाधन से जोड़ने के बजाय स्टैक एक्सचेंज की भावना (नई, नीति?) है, ताकि आपके उत्तर में उत्तर देने के बजाय जवाब दिया जा सके। इसके अलावा, उस पृष्ठ में स्पष्ट सूची नहीं है। यहां एक सूची मिल सकती है: docs.oracle.com/javase/tutorial/essential/regex/literals.html, फिर भी यह कहता है "कुछ स्थितियों में ऊपर सूचीबद्ध विशेष पात्र होंगे नहीं मेटाएक्टएक्टर्स के रूप में माना जाए, "अगर कोई उन्हें बचने की कोशिश करता है तो क्या होगा, इसके बिना यह बताएगा कि संक्षेप में, इस सवाल का जवाब अच्छा जवाब है। - Aleksandr Dubinsky
"उनके बीच सबकुछ [\Q तथा \E] बच निकला माना जाता है " - अन्य को छोड़कर \Q'रेत \E(जो संभावित रूप से मूल regex के भीतर हो सकता है)। तो, इसका उपयोग करना बेहतर है Pattern.quoteजैसे कि सुझाव दिया गया है यहाँ और पहिया को फिर से शुरू करने के लिए नहीं। - Sasha


  • जावा अक्षरों को नियमित अभिव्यक्तियों में से बचने के लिए हैं:
    \.[]{}()<>*+-=?^$|
  • बंद करने वाले दो ब्रैकेट्स (] तथा }) को उसी प्रकार के ब्रैकेट को खोलने के बाद ही बचने की आवश्यकता है।
  • में []कुछ अक्षर (जैसे + तथा -) कभी-कभी बचने के बिना काम करते हैं।

61
2017-10-07 05:03



क्या बचने का कोई तरीका नहीं है लेकिन उन पात्रों को अनुमति दें? - Dominika
एक चरित्र से बचने का अर्थ है ऑपरेटर के रूप में इसे व्याख्या करने के बजाय चरित्र को अनुमति देना। - Tobi G.
न छोड़े गए - अंदर [] हमेशा काम नहीं कर सकते क्योंकि इसका उपयोग सीमाओं को परिभाषित करने के लिए किया जाता है। इसे बचाना सुरक्षित है। उदाहरण के लिए, पैटर्न [-] तथा [-)] स्ट्रिंग से मेल खाते हैं - लेकिन साथ नहीं [(-)]। - Kenston Choi


बचने के लिए आप इसका उपयोग कर सकते हैं जावा 1.5:

Pattern.quote("$test");

आप शब्द को सटीक रूप से मेल करेंगे $test


18
2018-05-13 18:02





के अनुसार स्ट्रिंग लिटरेल्स / मेटाएक्टेक्टर्स प्रलेखन पृष्ठ, वे हैं:

<([{\^-=$!|]})?*+.>

यह भी अच्छा होगा कि उस सूची को कोड में कहीं भी रेफरी किया जाए, लेकिन मुझे नहीं पता कि यह कहां हो सकता है ...


14
2017-12-13 00:53



String escaped = tnk.replaceAll("[\\<\\(\\[\\{\\\\\\^\\-\\=\\$\\!\\|\\]\\}\\)\\?\\*\\+\\.\\>]", "\\\\$0"); - marbel82
पैटर्न javadoc का कहना है कि किसी भी वर्णमाला चरित्र से पहले बैकस्लैश का उपयोग करने में त्रुटि है जो बच निकलने वाले निर्माण को इंगित नहीं करता है, परंतु एक बैकस्लैश का प्रयोग गैर-वर्णमाला चरित्र से पहले किया जा सकता है चाहे वह चरित्र एक अनचाहे निर्माण का हिस्सा हो। इसलिए एक बहुत ही सरल regex पर्याप्त होगा: s.replaceAll("[\\W]", "\\\\$0") कहा पे \W गैर-शब्द वर्णों को नामित करता है। - Joe Bowbeer


जावा पैटर्न डॉक्स के @ सोरिन के सुझाव पर, ऐसा लगता है कि बचने के लिए वर्ण कम से कम हैं:

\.[{(*+?^$|

5
2018-02-12 04:17



String escaped = regexString.replaceAll("([\\\\\\.\\[\\{\\(\\*\\+\\?\\^\\$\\|])", "\\\\$1"); - fracz
) भी बच जाना होगा, और इस पर निर्भर करता है कि आप एक चरित्र वर्ग के अंदर या बाहर हैं या नहीं, इस मामले में भागने के लिए और अधिक पात्र हो सकते हैं Pattern.quote चरित्र वर्ग के अंदर और बाहर दोनों के उपयोग के लिए एक स्ट्रिंग से बचने में काफी अच्छा काम करता है। - nhahtdh


हर किसी ने जो कहा, उसका मिश्रण, मैं निम्नलिखित प्रस्तावों का प्रस्ताव करता हूं, विशेष रूप से RegExp को विशेष रूप से अपने स्वयं के स्ट्रिंग में सूचीबद्ध वर्णों की सूची रखने के लिए, और हजारों "\\" के दृश्यों को नजरअंदाज करने का प्रयास करने से बचने के लिए। ऐसा लगता है कि मेरे लिए बहुत अच्छा काम है:

final String regExSpecialChars = "<([{\\^-=$!|]})?*+.>";
final String regExSpecialCharsRE = regExSpecialChars.replaceAll( ".", "\\\\$0");
final Pattern reCharsREP = Pattern.compile( "[" + regExSpecialCharsRE + "]");

String quoteRegExSpecialChars( String s)
{
    Matcher m = reCharsREP.matcher( s);
    return m.replaceAll( "\\\\$0");
}

4
2018-04-01 06:22





सिक्का के दूसरी तरफ, आपको "गैर-चार" रेगेक्स का उपयोग करना चाहिए जो इस तरह दिखता है यदि विशेष वर्ण = allChars - संख्या - एबीसी - आपके ऐप संदर्भ में स्थान।

String regepx = "[^\\s\\w]*";

1
2018-01-03 07:39