में चला जाता है मैं पार्स करने कर रहा हूँ (प्रजाति) फार्म के नाम:नियमित अभिव्यक्ति अनंत लूप
Parus Ater
H. sapiens
T. rex
Tyr. rex
जो आम तौर पर दो शब्दों (द्विपद) लेकिन कभी कभी है 3 या उससे अधिक है।
Troglodytes troglodytes troglodytes
E. rubecula sensu stricto
मैं
[A-Z][a-z]*\.?\s+[a-z][a-z]+(\s*[a-z]+)*
जो समय के सबसे अधिक काम किया लेकिन कभी-कभी एक अनंत लूप में चला गया लिखा था। ऐसा नहीं है कि यह रेगुलर एक्सप्रेशन मिलान में था नीचे ट्रैक करने के लिए कुछ समय ले लिया और फिर मुझे एहसास हुआ कि यह एक टाइपो था और मैं
[A-Z][a-z]*\.?\s+[a-z][a-z]+(\s+[a-z]+)*
जो ठीक से प्रदर्शन करती लिखा जाना चाहिए था।
मेरे प्रश्न हैं:
- क्यों इस पाश होता है?
- क्या कोई तरीका है कि मैं प्रोग्राम चलाने से पहले समान रेगेक्स त्रुटियों की जांच कर सकता हूं? अन्यथा प्रग्राम वितरित होने से पहले उन्हें परेशान करना मुश्किल हो सकता है और समस्याएं पैदा होती हैं।
[नोट: मुझे प्रजातियों के लिए अधिक सामान्य अभिव्यक्ति की आवश्यकता नहीं है - प्रजातियों के नामों के लिए औपचारिक 100+ लाइन रेगेक्स विनिर्देशन है - यह केवल प्रारंभिक फ़िल्टर था]।
नोट: समस्या उत्पन्न हुई क्योंकि यद्यपि अधिकतर नाम 2 या कभी-कभी 3/4 शब्दों (जैसे वे इटालिक्स में थे) में निकाले गए थे, कुछ झूठे सकारात्मक थे (जैसे "Homo sapiens lives in big cities like London"
) और मैच "एल" में विफल रहता है। ]
नोट: डीबगिंग में मैंने पाया है कि रेगेक्स अक्सर पूरा हो रहा था लेकिन बहुत धीमा (उदाहरण के लिए छोटे लक्ष्य तारों पर)। यह मूल्यवान है कि मुझे इस बग को पैथोलॉजिकल केस के माध्यम से मिला। मैंने एक महत्वपूर्ण सबक सीखा है!
आप बस अगर एक regex अनंत लूप में प्रवेश करेंगे अनुमान नहीं लगा सकते। यदि आपके पास बहुत जटिल रेगेक्स ("100+ लाइन रेगेक्स") है, तो यह हो सकता है (मैं कह सकता हूं "शायद") कि आपको इसके बजाय किसी प्रकार का पार्सर चाहिए। –
मुझे लगता है कि आपको '(\ s + [az] +) +' 's \ [az] [az] + (\ s + [az] +) *' – shift66
@ shift66 के बजाय लिखा जाना चाहिए 'मैंने लिखा है \ nz [az] [एजी] + 'क्योंकि मैं यह सुनिश्चित करना चाहता था कि दूसरे शब्द में कम से कम 2 अक्षर हों। मुझे तीसरे और बाद में परवाह नहीं है। –