2008-10-03 20 views
12

जावा में पार्स से एक स्ट्रिंग पलायन, मैं एक स्ट्रिंग वैरिएबल एस है, और मुझे एक और स्ट्रिंग टी के अंदर इसके लिए खोज करने के लिए है, इसलिए की तरह चाहते हैं लगता है उपरोक्त रेखा T.contains() थी जब तक कि कुछ पदों ने इंगित नहीं किया कि वह विधि regexes का उपयोग नहीं करती है। मेरा बुरा।)हो रही regex जावा

लेकिन अब मान लीजिए एस में इसमें असभ्य वर्ण हो सकते हैं। उदाहरण के लिए, एस = "[हाय" दें। बाएं स्क्वायर ब्रैकेट रेगेक्स विफल होने का कारण बन रहा है। क्या कोई ऐसा कार्य है जिसे मैं एस से बचने के लिए बुला सकता हूं ताकि ऐसा न हो? इस विशेष मामले में, मैं इसे "\ [hi" में बदलना चाहता हूं।

+1

[जावा में नियमित अभिव्यक्ति के लिए पाठ से कैसे बचें] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/60160/how-to-escape-text-for-regular-expression-in-java) –

उत्तर

20

स्ट्रिंग.contains regex का उपयोग नहीं करता है, इसलिए इस मामले में कोई समस्या नहीं है।

जहां रेगेक्स विशेष वर्णों के साथ स्ट्रिंग को अस्वीकार करने के बजाय रेगेक्स की आवश्यकता होती है, तो उन्हें बचने के लिए java.util.regex.Pattern.quote का उपयोग करें।

2

इसके बजाय String.indexOf() का उपयोग न करने का कोई विशेष कारण? इस तरह इसे हमेशा रेगेक्स की बजाय नियमित स्ट्रिंग के रूप में व्याख्या किया जाएगा।

+1

चूंकि जावा 1.5 में स्ट्रिंग # है (...), जिसके परिणामस्वरूप indexOf (...) से अधिक पठनीय कोड होता है। –

0

रेगेक्स एक शाब्दिक से बचने के लिए बैकस्लैश चरित्र '\' का उपयोग करता है। यह देखते हुए जावा भी उपयोग करता है बैकस्लैश चरित्र आप की तरह एक डबल bashslash का उपयोग करने की आवश्यकता होगी:

\[hi 

जो regex को दे दिया जाएगा:

String S = "\\[hi" 

कि तार हो जाएगा।

या आप केवल एक शाब्दिक स्ट्रिंग के बारे में परवाह है और एक regex आप निम्न कर सकता है की जरूरत नहीं है, तो:

if (T.indexOf("[hi") != -1) { 
0

T.contains() (जावाडोक के अनुसार: http://java.sun.com/javase/6/docs/api/java/lang/String.html) regexes उपयोग नहीं करता। इंडेक्सऑफ() को केवल() प्रतिनिधि शामिल हैं।

तो, यहां कोई रेगेक्स उपयोग नहीं किया जाता है। क्या आप किसी अन्य स्ट्रिंग विधि के बारे में सोच रहे थे?

11

Tom Hawtin के रूप में, आपको पैटर्न को उद्धृत करने की आवश्यकता है।

  1. चारों ओर "\ क्यू" और "\ ई 'के साथ स्ट्रिंग, जैसे:

    if (T.matches("\\Q" + S + "\\E")) 
    
  2. आप दो तरह से (: वास्तव में तीन तरीके हैं, जैसा @ diastrophism द्वारा बताया संपादित) में यह कर सकते हैं
  3. इसके बजाय Pattern का उपयोग करें। कोड इस तरह कुछ होगा:

    Pattern sPattern = Pattern.compile(S, Pattern.LITERAL); 
    if (sPattern.matcher(T).matches()) { /* do something */ } 
    

    इस तरह, आप संकलित पैटर्न को कैश कर सकते हैं और इसका पुन: उपयोग कर सकते हैं। यदि आप एक ही रेगेक्स को एक से अधिक बार उपयोग कर रहे हैं, तो आप लगभग निश्चित रूप से ऐसा करना चाहते हैं।

ध्यान दें कि यदि आप एक स्ट्रिंग के अंदर एक स्ट्रिंग के अंदर नियमित जांच का उपयोग कर रहे हैं, तो आपको अभिव्यक्ति की शुरुआत और अंत में रखना चाहिए। * लेकिन यदि आप पैटर्न को उद्धृत कर रहे हैं तो यह काम नहीं करेगा, क्योंकि यह वास्तविक बिंदुओं की तलाश करेगा। तो, क्या आप बिल्कुल निश्चित हैं कि आप नियमित अभिव्यक्तियों का उपयोग करना चाहते हैं?

6

Pattern.quote(String) आज़माएं। यह स्ट्रिंग में विशेष अर्थ रखने वाले किसी भी चीज़ को ठीक करेगा।