क्या कोई विशेष वर्ण (मेटा-कैरेक्टर) से बचने के लिए जावा या किसी ओपन सोर्स लाइब्रेरी में नियमित अभिव्यक्ति के रूप में उपयोग करने के लिए कोई विधि है?जावा नियमित अभिव्यक्तियों में विशेष वर्णों से बचने
यह प्रत्येक व्यक्तिगत चरित्र को मैन्युअल रूप से बचने के बिना गतिशील रूप से नियमित अभिव्यक्ति बनाने में बहुत आसान होगा।
उदाहरण के लिए, पर विचार \d+\.\d+
की तरह एक साधारण regex कि 1.2
की तरह एक दशमलव बिंदु के साथ नंबर से मेल खाता है, साथ ही निम्न कोड:
String digit = "d";
String point = ".";
String regex1 = "\\d+\\.\\d+";
String regex2 = Pattern.quote(digit + "+" + point + digit + "+");
Pattern numbers1 = Pattern.compile(regex1);
Pattern numbers2 = Pattern.compile(regex2);
System.out.println("Regex 1: " + regex1);
if (numbers1.matcher("1.2").matches()) {
System.out.println("\tMatch");
} else {
System.out.println("\tNo match");
}
System.out.println("Regex 2: " + regex2);
if (numbers2.matcher("1.2").matches()) {
System.out.println("\tMatch");
} else {
System.out.println("\tNo match");
}
नहीं आश्चर्यजनक रूप से, उत्पादन ऊपर कोड से तैयार की है:
Regex 1: \d+\.\d+
Match
Regex 2: \Qd+.d+\E
No match
है, regex1
मैचों 1.2
लेकिन regex2
(जो "गतिशील" का निर्माण किया है) नहीं (इसके बजाय, यह शाब्दिक स्ट्रिंग से मेल खाता है +०१२३७७६२१२)।
तो, क्या कोई ऐसी विधि है जो स्वचालित रूप से प्रत्येक रेगेक्स मेटा-कैरेक्टर से बच जाएगी?
अगर वहाँ थे,, मान लें कि java.util.regex.Pattern
में एक स्थिर escape()
विधि,
Pattern.escape('.')
के उत्पादन में स्ट्रिंग "\."
होगा, लेकिन
Pattern.escape(',')
सिर्फ ","
प्रस्तुत करना चाहिए, क्योंकि यह है एक मेटा-चरित्र नहीं। इसी तरह,
Pattern.escape('d')
"\d"
उत्पादन कर सकता है, 'd'
के बाद अंक निरूपित करने के लिए (हालांकि एस्केपिंग इस मामले में कोई मतलब नहीं हो सकता है प्रयोग किया जाता है, के रूप में 'd'
अर्थ हो सकता है शाब्दिक 'd'
, जो regex interpeter द्वारा गलत समझा नहीं जाएगा, वे करने के लिए कुछ और, जैसा कि '.'
के साथ होगा)।
है कैसे इस तरह के एक विधि beween एक 'मतलब d' अंतर निर्धारित करेंगे मिलान करने के लिए पाठ में मेटा चरित्र और 'd' के रूप में? ('उद्धरण (" डी + डॉलर? ")' '\\ d + \\ डॉलर \\ s?" 'एक छोटी उद्धरण विधि में होगा।) – rsp
सही, यही कारण है कि मैं एक विधि के लिए पूछ रहा हूं जो बच जाएगा व्यक्तिगत पात्र! :-) – PNS
केवल व्यक्तिगत वर्णों से बचने के लिए आप एक शब्द सीमा से मेल खाने के साथ खेल सकते हैं, जैसे कुछ: 's/\ b ([dswDSW]) \ b/\\ $ 1/g;' – rsp