2015-10-30 2 views
7

ऐसा लगता है कि एक स्ट्रिंग जिसमें { या } वर्ण शामिल हैं, रेगेक्स प्रोसेसिंग के दौरान अस्वीकार कर दिया गया है। मैं समझ सकता है कि इन आरक्षित वर्ण हैं और मैं उन्हें इतना बचने के लिए अगर मैं करता हूँ की जरूरत है:क्या मुझे हमेशा एक स्ट्रिंग में मेटाएक्टैक्टर्स से बचने की ज़रूरत है जो "शाब्दिक" नहीं है?

string.replaceAll("\\" + pattern); 

यह काम करता है, जहां pattern किसी भी { के साथ शुरू स्ट्रिंग है।

प्रश्न: क्या ऐसी समस्याओं से बचने का कोई तरीका है जिसमें पहले से ही ऐसे मेटाचर्स हैं ताकि इसे स्वचालित रूप से संभाला जा सके? मुझे लगता है यह इनपुट के रूप में एक स्ट्रिंग पहले से ही दोहरे उद्धरण

+2

'replaceAll' के बजाय 'प्रतिस्थापन' का उपयोग करें। – Pshemo

+0

@Pshemo: वे अलग व्यवहार करते हैं? – Jim

+0

दस्तावेज़ीकरण पढ़ें ... 'प्रतिस्थापन (चार, चार)' और 'प्रतिस्थापन (स्ट्रिंग, स्ट्रिंग) है 'दोनों को आपके लिए काम करना चाहिए। – Pshemo

उत्तर

4

है कि स्वीकार करने बनाम शाब्दिक एक स्ट्रिंग में एक दोहरे उद्धरण जोड़ने के समान होना चाहिए आप

java.util.regex.Pattern.quote(java.lang.String) 

उपयोग कर सकते हैं मेटा नियमित द्वारा उपयोग किए गए वर्णों से बचने के लिए भाव।

8

उपयोग Pattern.quote(String):

public static String quote(String s) 

निर्दिष्ट String के लिए एक शाब्दिक पैटर्न String देता है।

यह विधि String उत्पन्न करती है जिसका उपयोग Pattern बनाने के लिए किया जा सकता है जो स्ट्रिंग s से मेल खाता है जैसे कि यह एक शाब्दिक पैटर्न था।

इनपुट अनुक्रम में मेटाएक्टेक्टर या भागने के दृश्यों को कोई विशेष अर्थ नहीं दिया जाएगा।

पैरामीटर:
        s - स्ट्रिंग
रिटर्न literalized जा करने के लिए:
        एक शाब्दिक स्ट्रिंग प्रतिस्थापन
के बाद से:
        1,5

3

टी एल; डॉ

  • आप regex वाक्यविन्यास उपयोग replaceAll या replaceFirst जरूरत है,
  • अगर आप चाहते हैं के रूप में शाब्दिक replace का उपयोग अपने target/replacement जोड़ी इलाज किया जाना है (यह भी बदल देता है सभी आपके लक्ष्य की घटनाएं)।

    • replaceAll(String, String)
    • replaceFirst(String, String)
    • replace(CharSequence, CharSequence)
    • replace(char, char)
    :

अधिकांश लोगों को स्ट्रिंग कक्षा में जगह तरीकों जो कर रहे हैं के दुर्भाग्यपूर्ण नामकरण से उलझन में रहे हैं

के बाद से replaceAll विधि स्पष्ट रूप से दावा है कि यह सभी posible के लक्ष्यों को बदल देता है, लोगों को लगता है कि replace विधि इस तरह के व्यवहार की गारंटी नहीं है नहीं है, क्योंकि यह All प्रत्यय शामिल नहीं है।
लेकिन यह धारणा गलत है।

इन तरीकों के बीच मुख्य अंतर इस तालिका में दिखाया गया है:

╔═════════════════════╦═══════════════════════════════════════════════════════════════════╗ 
║      ║        replaced targets      ║ 
║      ╠════════════════════════════════════╦══════════════════════════════╣ 
║      ║   ALL found    ║  ONLY FIRST found  ║ 
╠══════╦══════════════╬════════════════════════════════════╬══════════════════════════════╣ 
║  ║ supported ║ replaceAll(String, String)   ║ replaceFirst(String, String) ║ 
║regex ╠══════════════╬════════════════════════════════════╬══════════════════════════════╣ 
║syntax║  not  ║ replace(CharSequence, CharSequence)║    \/    ║ 
║  ║ supported ║ replace(char, char)    ║    /\    ║ 
╚══════╩══════════════╩════════════════════════════════════╩══════════════════════════════╝ 

अब अगर आप रेगुलर एक्सप्रेशन से वाक्य रचना उपयोग विधि है जो यह उम्मीद नहीं करता है का उपयोग करने की जरूरत नहीं है, लेकिन यह target और replacement व्यवहार करता है शाब्दिक के रूप में।

तो बजाय replaceAll(regex, replacement)

उपयोग replace(literal, replacement)


जैसा कि आप देख replace के दो अतिभारित संस्करण हैं। वे दोनों आपके लिए काम करना चाहिए क्योंकि वे रेगेक्स वाक्यविन्यास का समर्थन नहीं करते हैं।

  • replace(char target, char replacement) बस नए स्ट्रिंग बनाता है और इसे भरने या तो मूल स्ट्रिंग से चरित्र के साथ, या चरित्र आप स्थानापन्न के रूप में फैसला किया (निर्भर करता है अगर यह चरित्र को लक्षित करने के बराबर था)

  • : उन दोनों के बीच मुख्य अंतर यह है कि है replace(CharSequence target, CharSequence replacement) replaceAll(Pattern.quote(target), Matcher.quoteReplacement(replacement.toString()) जिसका अर्थ है कि यह replaceAll रूप में ही है की अनिवार्य रूप से बराबर है लेकिन (जिसका अर्थ है वह आंतरिक रूप से regex इंजन का उपयोग करता है), लेकिन यह हमारे लिए target और replacement में स्वचालित रूप से इस्तेमाल किया regex अक्षरों से परे निकल जाता है

+0

@downvoter इस बात का जिक्र करने का ध्यान रखता है कि इस उत्तर में क्या गलत है, इसलिए मैं इसे सुधार सकता हूं? – Pshemo

+0

अच्छी जानकारी, यदि आप जावा रेगेक्स को गहराई से सीखना चाहते हैं तो आप मुझे कौन सी सामग्री की सिफारिश करेंगे? :) – Muhammad

+1

@ मुहम्मद http://www.regular-expressions.info/tutorial.html सबसे अच्छा ट्यूटोरियल है जो मैंने अभी तक शुद्ध रेगेक्स और इसके अधिकांश स्वादों को विभिन्न भाषाओं में लागू किया है। जावा रेगेक्स ट्यूटोरियल भी अच्छा है https://docs.oracle.com/javase/tutorial/essential/regex/ लेकिन आपको पैटर्न वर्ग https://docs.oracle.com/javase/8/docs/api के दस्तावेज़ भी पढ़ना चाहिए /java/util/regex/Pattern.html जिसमें जावा में रेगेक्स तंत्र समर्थित हैं, इस बारे में बहुत सारी जानकारीएं हैं। – Pshemo

0

आप के रूप Java's Pattern class में दस्तावेज, किसी भी अतिरिक्त कोड, बस \Q और \E निर्माणों की जरूरत नहीं है।

उदाहरण के लिए

, निम्नलिखित कोड में:

String foobar = "crazyPassword=f()[email protected]{}+"; 
Pattern regex = Pattern.compile("\\Q" + foobar "\\E"); 

पैटर्न संकलन होगा और foobar के विशेष वर्ण regex वर्ण समझ नहीं किया जाएगा। डेमो here देखें।

एकमात्र चीज जो यह मेल नहीं खाती है वह है जहां इनपुट में एक शाब्दिक \E होता है। यदि आपको उस समस्या को हल करने की भी आवश्यकता है, तो बस मुझे एक टिप्पणी में बताएं और मैं इसे जोड़ने के लिए संपादित करूंगा।

संबंधित मुद्दे