Regex एक वैकल्पिक चरित्र का मिलान कैसे करें


147

मुझे लगता है कि मैंने सोचा था कि अब तक सही ढंग से काम कर रहा था। मुझे एक वैकल्पिक चरित्र पर मेल खाना चाहिए। यह वहाँ हो सकता है या यह नहीं हो सकता है।

यहाँ दो तार हैं। शीर्ष स्ट्रिंग का मिलान किया जाता है जबकि निचला नहीं होता है। निचले स्ट्रिंग में एक भी अक्षर की अनुपस्थिति वह है जो इसे विफल बना रही है।

मैं 5 अंक शुरू करने के बाद एकल पत्र प्राप्त करना चाहता हूं यदि यह वहां है और यदि नहीं, तो बाकी स्ट्रिंग प्राप्त करना जारी रखें। यह पत्र हो सकता है A-Z

यदि मैं ([A-Z]{1}) +.*? +रेगेक्स से हटाता हूं , तो यह पत्र को छोड़कर मेरी जरूरत की सभी चीजों से मेल खाएगा लेकिन यह महत्वपूर्ण है।

20000      K               Q511195DREWBT            E00078748521
30000                      K601220PLOPOH            Z00054878524

यहाँ regex मैं उपयोग कर रहा हूँ।

/^([0-9]{5})+.*? ([A-Z]{1}) +.*? +([A-Z]{1})([0-9]{3})([0-9]{3})([A-Z]{3})([A-Z]{3}) +([A-Z])[0-9]{3}([0-9]{4})([0-9]{2})([0-9]{2})/

जवाबों:


246

उपयोग

[A-Z]?

पत्र को वैकल्पिक बनाने के लिए। {1}बेमानी है। (बेशक आप यह भी लिख सकते हैं [A-Z]{0,1}कि इसका मतलब वही होगा, लेकिन यह वही है ?जो इसके लिए है।)

आप अपने regex में सुधार कर सकते हैं

^([0-9]{5})+\s+([A-Z]?)\s+([A-Z])([0-9]{3})([0-9]{3})([A-Z]{3})([A-Z]{3})\s+([A-Z])[0-9]{3}([0-9]{4})([0-9]{2})([0-9]{2})

और, चूंकि अधिकांश रेगेक्स बोलियाँ, \dसमान हैं [0-9]:

^(\d{5})+\s+([A-Z]?)\s+([A-Z])(\d{3})(\d{3})([A-Z]{3})([A-Z]{3})\s+([A-Z])\d{3}(\d{4})(\d{2})(\d{2})

लेकिन: क्या आपको वास्तव में 11 अलग-अलग कैप्चरिंग समूहों की आवश्यकता है? और यदि हां, तो आप अंकों के चौथे-से-अंतिम समूह पर कब्जा क्यों नहीं करते हैं?


टिम, मैं ईमानदारी से यकीन नहीं कर रहा हूं क्योंकि मैंने इस रेगेक्स को नहीं लिखा है। मैं अभी भी regex के लिए बहुत नया हूँ। यदि आप इसे लिखने का बेहतर तरीका देखते हैं, तो मैं सुझावों के लिए तैयार हूं।
जिम

1
टिम, आपका उदाहरण दोनों तारों के लिए काम करता है चाहे मेरे पास उस स्थिति में कोई पत्र हो या नहीं। धन्यवाद।
जिम

26

आप एकल अक्षर ?को इसके बाद जोड़कर वैकल्पिक बना सकते हैं :

([A-Z]{1}?)

क्वांटिफायर {1}बेमानी है इसलिए आप इसे छोड़ सकते हैं।


धन्यवाद सांकेतिक क्या प्रश्न चिह्न `+। * की जगह लेता है? + `?
जीम

Grep regex का उपयोग करते समय आपको एक त्रुटि मिलेगी यदि आप {1} ड्रॉप करते हैं (grep: लुकअप एश्योरेंस निश्चित लंबाई नहीं है)। इसलिए इसे छोड़ने का मामला है।
Zunderscore

6

आपको एकल अक्षर को वैकल्पिक के रूप में चिह्नित करना होगा:

([A-Z]{1})? +.*? +

या पूरे भाग को वैकल्पिक बनाएं

(([A-Z]{1}) +.*? +)?

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

0

तुम भी सरल की तरह अपने मामले के लिए बनाया गया regex का उपयोग कर सकता है (.*)\/(([^\?\n\r])*)जहां $2से मेल खाते हैं कि आप क्या चाहते।

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