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


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

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

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

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

20000      K               Q511195DREWBT            E00078748521
30000                      K601220PLOPOH            Z00054878524

यहां रेगेक्स है जिसका मैं उपयोग कर रहा हूं।

/^([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})/

76
2017-10-24 06:34


मूल




जवाब:


उपयोग

[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 अलग-अलग कैप्चरिंग समूहों की आवश्यकता है? और यदि हां, तो आप अंकों के चौथे से अंतिम समूह को क्यों नहीं पकड़ते?


142
2017-10-24 06:44



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


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

([A-Z]{1}?)

क्वांटिफायर {1} अनावश्यक है ताकि आप इसे छोड़ सकें।


13
2017-10-24 06:42



धन्यवाद कोडडिक्ट। क्या प्रश्न चिह्न `+ * * की जगह लेता है? + `? - jim
Grep regex का उपयोग करते समय आपको एक त्रुटि मिलेगी यदि आप {1} ड्रॉप करते हैं (grep: lookbehind assertion निश्चित लंबाई नहीं है)। तो यह इसे छोड़ने का मामला है। - Zunderscore


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

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

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

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

4
2017-10-24 06:44



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