जावा RegEx मेटा चरित्र (?) और साधारण डॉट?


150

Java RegEx में, .मेटा कैरेक्टर और नॉर्मल डॉट के बीच अंतर को कैसे पता करें, जैसा कि हम किसी भी वाक्य में प्रयोग करते हैं। कैसे भी जैसे अन्य मेटा पात्रों के लिए स्थिति इस तरह की संभाल करने के लिए ( *, +, \d, ...)

जवाबों:


276

यदि आप चाहते हैं कि डॉट्स या अन्य वर्ण रीगेक्स में एक विशेष अर्थ के साथ एक सामान्य चरित्र हो, तो आपको इसे बैकस्लैश से बचना होगा। चूंकि जावा में रेग्जेस सामान्य जावा स्ट्रिंग्स हैं, इसलिए आपको बैकस्लैश से खुद को बचाना होगा, इसलिए आपको दो बैकलैश की जरूरत है जैसे\\.


1
यह सुधार भी करने के लिए पार्टी पर लागू होता है
krivar

18
ध्यान रखें कि बैकस्लैश से बचना है या नहीं यह इस बात पर निर्भर करता है कि आप रेगेक्स की आपूर्ति कैसे कर रहे हैं। अगर हार्डकोड आपको उपयोग करने की आवश्यकता है: "\\" , अगर एक कच्चे स्रोत (जैसे पाठ फ़ाइल) से पढ़ रहे हैं, तो आप केवल एक ही बैकस्लैश का उपयोग करते हैं: \।
पॉल

25

अन्य सदस्यों द्वारा प्रस्तावित समाधान मेरे लिए काम नहीं करते हैं।

लेकिन मैंने यह पाया:

जावा regexp लिखने में एक डॉट से बचने के लिए [.]


2
वही, \\.मेरे लिए काम नहीं करता था: \.शिकायत की गई कि .बच निकलने की जरूरत नहीं है, \\.ऐसा लगता है कि यह \.इसके बजाय था ., \\\.और बिल्डर ने एक त्रुटि फेंक दी, [.]केवल एक चीज थी जिसने काम किया।
मिथुन

1
@mithunc यह अजीब है, \\.एक स्ट्रिंग शाब्दिक के अंदर आपको देता \.है जो कि रेगेक्स को किसी भी चरित्र के मिलानकर्ता के बजाय डॉट को शाब्दिक बिंदु के रूप में देखना होगा।
कलार

16

पर्ल-स्टाइल रेग्युलर एक्सप्रेशंस (जो जावा रेगेक्स इंजन कम या ज्यादा आधारित है) निम्न वर्णों को विशेष वर्ण मानते हैं:

.^$|*+?()[{\चरित्र वर्गों के बाहर विशेष अर्थ है ,

]^-\चरित्र वर्गों के अंदर विशेष अर्थ है ( [...])।

इसलिए आपको संदर्भ के आधार पर उन (और केवल उन) प्रतीकों से बचने की जरूरत है (या, चरित्र वर्गों के मामले में, उन्हें उन स्थितियों में रखें जहां उन्हें गलत तरीके से समझा नहीं जा सकता है)।

अनावश्यक रूप से अन्य वर्णों से बचकर काम हो सकता है, लेकिन कुछ रेगेक्स इंजन इसे सिंटैक्स त्रुटियों के रूप में मानेंगे, उदाहरण के लिए \_.NET में त्रुटि का कारण होगा।

कुछ अन्य लोग गलत परिणाम देंगे, उदाहरण के लिए पर्ल में \<शाब्दिक रूप में व्याख्या की गई है <, लेकिन egrepइसका अर्थ है "शब्द सीमा"।

तो -?\d+\.\d+\$मैच के लिए लिखें 1.50$, -2.00$आदि और [(){}[\]]एक चरित्र वर्ग के लिए जो सभी प्रकार के कोष्ठक / ब्रेसिज़ / कोष्ठक से मेल खाता है।

यदि आपको एक उपयोगकर्ता इनपुट स्ट्रिंग को रेगेक्स-सुरक्षित रूप में बदलने की आवश्यकता है, तो उपयोग करें java.util.regex.Pattern.quote

आगे पढ़े: जान गोएर्ट के ब्लॉग रेगेक्सगुरु पर मेटाचेटर्स से बचते हुए


4

एक बैकस्लैश के साथ विशेष वर्णों से बच। \., \*, \+, \\d, और पर इतना। यदि आप अनिश्चित हैं, तो आप किसी भी गैर-वर्णानुक्रमिक चरित्र से बच सकते हैं चाहे वह विशेष हो या न हो। अधिक जानकारी के लिए java.util.regex.Pattern के लिए javadoc देखें ।


गैर-विशेष वर्णों को बचाना अनावश्यक रूप से कुछ भाषाओं में काम कर सकता है, लेकिन दूसरों में विफल हो सकता है, इसलिए आदत में न आना बेहतर है।
टिम पीत्ज़ेकर

1
यह प्रश्न विशेष रूप से जावा के बारे में है, और docs.oracle.com/javase/6/docs/api/java/util/regex/… "कहते हैं कि" बैकस्लैश का उपयोग गैर-वर्णानुक्रम से पहले किया जा सकता है, भले ही वह चरित्र हो या नहीं एक बिना निर्माण के भाग। "
क्रिस्टोफर हम्मरस्ट्रॉम जूल

2

यहाँ कोड है जिसे आप सीधे कॉपी पेस्ट कर सकते हैं:

String imageName = "picture1.jpg";
String [] imageNameArray = imageName.split("\\.");
for(int i =0; i< imageNameArray.length ; i++)
{
   system.out.println(imageNameArray[i]);
}

और क्या होगा अगर गलती से पहले या बाद में रिक्त स्थान छूट गए हैं "।" ऐसे मामलो मे? उन स्थानों पर भी विचार करना हमेशा सबसे अच्छा अभ्यास है।

String imageName = "picture1  . jpg";
String [] imageNameArray = imageName.split("\\s*.\\s*");
    for(int i =0; i< imageNameArray.length ; i++)
    {
       system.out.println(imageNameArray[i]);
    }

यहाँ, रिक्त स्थान पर विचार करने के लिए \\ s * है और आपको केवल आवश्यक विभाजन प्रदान करना है।


1

मैं एक स्ट्रिंग से मेल खाना चाहता था जो "। *" के साथ समाप्त हो। इसके लिए मुझे निम्नलिखित का उपयोग करना था:

"^.*\\.\\*$"

अगर आप इसके बारे में सोचते हैं तो Kinda मूर्खतापूर्ण: D Heres इसका क्या मतलब है। स्ट्रिंग की शुरुआत में कोई भी चरित्र शून्य या उससे अधिक बार हो सकता है जिसके बाद एक बिंदु होता है "।" एक स्टार (*) के बाद स्ट्रिंग के अंत में।

मुझे उम्मीद है कि यह किसी के लिए काम आता है। फेबियन को बैकस्लैश चीज़ के लिए धन्यवाद।


बस "\\.\\*$"तब का उपयोग करें । यदि यह आपके लिए महत्वपूर्ण नहीं है तो स्ट्रिंग की शुरुआत के लिए मिलान करने की आवश्यकता नहीं है।
ओफिडियन

हाँ आप सही हैं। सच कहूं तो, मैं इसके लिए उपयोग के मामले को याद नहीं कर सकता: /
Atspulgs

वास्तव में आपकी मदद करने के लिए नहीं बल्कि आपकी पोस्ट को देखने में दूसरों की मदद करने के लिए था: P
Ophidian

0

यदि आप यह जांचना चाहते हैं कि आपकी सजा "" समाप्त होती है या नहीं, तो आपको अपने पैटर्न के अंत में [\ _। ] $ जोड़ना होगा


0

मैं JGrasp में कुछ बुनियादी सरणी कर रहा हूं और पाया कि एक सिंगल डॉट को रखने के लिए एक चार [] [] [का उपयोग करने के लिए ('।) के लिए एक एक्सेसर विधि के साथ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.