जवाबों:
जावा 1.5 के बाद से , हाँ :
Pattern.quote("$5");
"mouse".toUpperCase().replaceAll("OUS","ic")
तो लौटोगे MicE
। आप इसे वापस करने की उम्मीद would't MICE
क्योंकि आप लागू नहीं किया था toUpperCase()
पर ic
। मेरे उदाहरण quote()
में .*
इन्सर्ट पर भी लागू किया गया है replaceAll()
। आपको कुछ और .replaceAll("*","\\E.*\\Q")
करना होगा , शायद काम करना होगा, लेकिन यह एक प्रकार का काम है।
*.wav
रेगेक्स पैटर्न में बदल जाएगा \*\.wav
, और रिप्लेसमैन इसे बदल देगा \.*\.wav
, जिसका अर्थ है कि यह होगा उन फ़ाइलों से मेल करें जिनके नाम में एक मनमानी संख्या सम्मिलित है, उसके बाद .wav
। आप सबसे अधिक संभावना है कि replaceAll("\\*", ".*")
अगर वे अधिक नाजुक कार्यान्वयन के साथ चले गए थे, जो सभी संभव सक्रिय regex charachters को पहचानने और उन्हें व्यक्तिगत रूप से भागने पर निर्भर करता है ... क्या यह इतना आसान होगा?
निम्नलिखित उदाहरण देखने से पहले मेरे बीच अंतर Pattern.quote
और Matcher.quoteReplacement
मेरे लिए स्पष्ट नहीं था
s.replaceFirst(Pattern.quote("text to replace"),
Matcher.quoteReplacement("replacement text"));
Pattern.quote
regex खोज स्ट्रिंग्स में विशेष वर्णों को प्रतिस्थापित करता है, जैसे। (+) आदि, और Matcher.quoteReplacement
प्रतिस्थापन स्ट्रिंग्स में विशेष वर्णों को प्रतिस्थापित करता है, जैसे backreferences के लिए \ 1।
quoteReplacement
दो प्रतीकों के बारे में केवल चिंताओं $
और \
जो उदाहरण के लिए backreferences के रूप में बदलने तार में इस्तेमाल किया जा सकता $1
या \1
। इसलिए इसका उपयोग प्रतिगमन से बचने / उद्धरण के लिए नहीं किया जाना चाहिए।
$Group$
साथ बदलना चाहते हैं T$UYO$HI
। $
प्रतीक दोनों पैटर्न में और प्रतिस्थापन में खास है:"$Group$ Members".replaceFirst(Pattern.quote("$Group$"), Matcher.quoteReplacement("T$UYO$HI"))
प्रतिक्रिया देने में बहुत देर हो सकती है, लेकिन आप इसका उपयोग भी कर सकते हैं Pattern.LITERAL
, जो प्रारूपण करते समय सभी विशेष वर्णों को अनदेखा करेगा:
Pattern.compile(textToFormat, Pattern.LITERAL);
Pattern.CASE_INSENSITIVE
मुझे लगता है कि तुम क्या हो \Q$5\E
। और देखेंPattern.quote(s)
Java5 में पेश किया गया है।
देखें पैटर्न जानकारी के लिए जावाडोक।
सबसे पहले, अगर
यह अंत में 1 नहीं रखेगा। यह पहले मिलान समूह और उप THAT के लिए खोज regex को देखेगा। प्रतिस्थापन पाठ में $ 1, $ 2 या $ 3 का अर्थ है: खोज पैटर्न से मिलान समूह।
मैं अक्सर .properties फ़ाइलों में पाठ के लंबे तार प्लग करता हूं, फिर उन लोगों से ईमेल विषय और निकाय उत्पन्न करता हूं। दरअसल, यह स्प्रिंग फ्रेमवर्क में i18n करने का डिफ़ॉल्ट तरीका है। मैं XML टैग्स को प्लेसहोल्डर्स के रूप में, स्ट्रिंग्स में डालता हूं और मैं रनटाइम पर मानों के साथ XML टैग्स को बदलने के लिए प्रतिस्थापन () का उपयोग करता हूं।
मैं एक मुद्दे में भाग गया, जहां एक उपयोगकर्ता डॉलर के संकेत के साथ एक डॉलर-और-सेंट का आंकड़ा देता है। प्रतिस्थापन () उस पर घुटा हुआ है, जिसमें एक स्ट्रेक्ट्रेस में दिखाया गया है:
java.lang.IndexOutOfBoundsException: No group 3
at java.util.regex.Matcher.start(Matcher.java:374)
at java.util.regex.Matcher.appendReplacement(Matcher.java:748)
at java.util.regex.Matcher.replaceAll(Matcher.java:823)
at java.lang.String.replaceAll(String.java:2201)
इस मामले में, उपयोगकर्ता ने अपने इनपुट में कहीं और "$ 3" दर्ज किया था और प्रतिस्थापन () तीसरे मिलान समूह के लिए खोज regex में देख रहा था, एक नहीं मिला, और puked।
दिया हुआ:
// "msg" is a string from a .properties file, containing "<userInput />" among other tags
// "userInput" is a String containing the user's input
जगह
msg = msg.replaceAll("<userInput \\/>", userInput);
साथ में
msg = msg.replaceAll("<userInput \\/>", Matcher.quoteReplacement(userInput));
समस्या का हल किया। उपयोगकर्ता बिना किसी मुद्दे के डॉलर के संकेत सहित किसी भी प्रकार के पात्रों में डाल सकता है। यह वैसा ही व्यवहार करता है जैसा आप अपेक्षा करते हैं।
संरक्षित पैटर्न के लिए आप सभी प्रतीकों को "\\\\" से बदल सकते हैं, अंकों और अक्षरों को छोड़कर। और उसके बाद आप उस संरक्षित पैटर्न में अपने विशेष प्रतीकों को रख सकते हैं ताकि यह पैटर्न काम न कर सके, जैसे कि स्टुप्ड टेक्स्ट की तरह, लेकिन वास्तव में एक पैटन की तरह, लेकिन आपका अपना। उपयोगकर्ता विशेष प्रतीकों के बिना।
public class Test {
public static void main(String[] args) {
String str = "y z (111)";
String p1 = "x x (111)";
String p2 = ".* .* \\(111\\)";
p1 = escapeRE(p1);
p1 = p1.replace("x", ".*");
System.out.println( p1 + "-->" + str.matches(p1) );
//.*\ .*\ \(111\)-->true
System.out.println( p2 + "-->" + str.matches(p2) );
//.* .* \(111\)-->true
}
public static String escapeRE(String str) {
//Pattern escaper = Pattern.compile("([^a-zA-z0-9])");
//return escaper.matcher(str).replaceAll("\\\\$1");
return str.replaceAll("([^a-zA-Z0-9])", "\\\\$1");
}
}
प्रतिमान .quote ("ब्लाब्ला") अच्छी तरह से काम करता है।
पैटर्न .quote () अच्छी तरह से काम करता है। यह अक्षर " \ " और " \ " के साथ वाक्य को जोड़ता है , और यदि यह "\" और "ई" से बच जाता है। हालांकि, यदि आपको भागने (या कस्टम भागने) के लिए एक वास्तविक नियमित अभिव्यक्ति करने की आवश्यकता है, तो आप इस कोड का उपयोग कर सकते हैं:
String someText = "Some/s/wText*/,**";
System.out.println(someText.replaceAll("[-\\[\\]{}()*+?.,\\\\\\\\^$|#\\\\s]", "\\\\$0"));
यह विधि लौटाती है: कुछ / \ s / wText * / \, **
उदाहरण और परीक्षणों के लिए कोड:
String someText = "Some\\E/s/wText*/,**";
System.out.println("Pattern.quote: "+ Pattern.quote(someText));
System.out.println("Full escape: "+someText.replaceAll("[-\\[\\]{}()*+?.,\\\\\\\\^$|#\\\\s]", "\\\\$0"));
^ (नकारात्मकता) प्रतीक का उपयोग उस चीज से मेल खाने के लिए किया जाता है जो चरित्र समूह में नहीं है।
इसी की कड़ी है रेगुलर एक्सप्रेशंस
यहाँ नकारात्मक के बारे में जानकारी है:
\Q
और\E
। इससे आपको अप्रत्याशित परिणाम प्राप्त हो सकते हैं, उदाहरण के लिए , जैसा कि आप उम्मीद कर सकते हैं,Pattern.quote("*.wav").replaceAll("*",".*")
परिणाम देगा\Q.*.wav\E
या नहीं.*\.wav
।