2009-05-28 14 views
16

मैं अक्सर नियमित अभिव्यक्ति संशोधक m और s और उनके मतभेदों के बारे में भूल जाता हूं। उन्हें याद रखने का एक अच्छा तरीका क्या है?नियमित अभिव्यक्ति संशोधक 'एम' और 'एस' के बीच अंतर?

जैसा कि मैंने उन्हें समझ, वे हैं:

'm', बहु के लिए है ताकि ^ और $ स्ट्रिंग की शुरुआत से मेल खाते हैं और अंत में स्ट्रिंग कई बार होगा। (\n से विभाजित के रूप में)

'एस' है ताकि डॉट भी न्यू लाइन चरित्र

अक्सर की भरपाई कर देंगे, मैं सिर्फ

/some_pattern/ism 

का उपयोग लेकिन यह शायद बेहतर है तदनुसार उनका उपयोग करें (आमतौर पर "मेरे मामलों में")।

क्या आपको लगता है कि उन्हें याद रखने का एक अच्छा तरीका क्या हो सकता है, हर बार कौन सा भूलना भूल जाता है?

मीटर उपचार स्ट्रिंग के रूप में मीटर अनेक लाइनों:

उत्तर

16

किसी ऐसे व्यक्ति को ढूंढना असामान्य नहीं है जो वर्षों से regexes का उपयोग कर रहा है जो अभी भी समझ में नहीं आता कि ये दो संशोधक कैसे काम करते हैं। जैसा कि आपने देखा, "multiline" और "सिंगलाइन" नाम बहुत उपयोगी नहीं हैं। वे ध्वनि की तरह लगता है कि वे परस्पर अनन्य होना चाहिए, लेकिन वे पूरी तरह से स्वतंत्र हैं। मेरा सुझाव है कि आप नामों को अनदेखा करें और ध्यान दें कि वे क्या करते हैं: m एंकरों के व्यवहार को बदलता है (^ और $), और s डॉट (.) के व्यवहार को बदलता है।

मोड में मिश्रित एक प्रमुख व्यक्ति रूबी का लेखक है। उन्होंने पर्ल के आधार पर अपना खुद का रेगेक्स कार्यान्वयन बनाया, सिवाय इसके कि उन्होंने ^ और $ हमेशा लाइन एंकर होने का निर्णय लिया - यानी, मल्टीलाइन मोड हमेशा चालू रहता है। दुर्भाग्यवश, उन्होंने गलत तरीके से डॉट-मैचों-सब कुछ मोड मल्टीलाइन नाम दिया। तो रुबी के पास s संशोधक नहीं है, लेकिन इसके m संशोधक क्या करता है s अन्य स्वादों में करता है।

हमेशा /ism का उपयोग करने के लिए, मैं इसके खिलाफ अनुशंसा करता हूं। जैसा कि आपने पाया है, यह ज्यादातर हानिरहित है, लेकिन यह किसी अन्य व्यक्ति को भ्रमित संदेश भेजता है जो यह पता लगाने की कोशिश कर रहा है कि रेगेक्स क्या करना चाहिए (या भविष्य में भी, खुद को)।

+0

पर पढ़ा है, अगर रूबी में, तो मैं इसे केवल शुरुआत और अंत से मेल खाना चाहता हूं स्ट्रिंग का, अनदेखा \ n? –

+1

फिर आप \ A और \ z का उपयोग करते हैं। वे अन्य स्वादों में भी उपलब्ध हैं; आप उन्हें बहुत ज्यादा इस्तेमाल नहीं देखते हैं। –

10

मैं 'आदमी perlre' में स्पष्टीकरण चाहते।
एसएस इंजेल लाइन के रूप में स्ट्रिंग का इलाज करें।

एकाधिक लाइनों के साथ,^और $ व्यक्तिगत लाइनों पर लागू होते हैं (यानी न्यूलाइन के ठीक पहले और बाद में)।
एक पंक्ति के साथ,^और $ पूरे पर लागू होते हैं, और \ n बस एक और चरित्र बन जाता है जिसे आप मिलान कर सकते हैं।

[गलत] जैसा कि आपने वर्णन किया है, एम और एस दोनों का उपयोग करके, मैं उम्मीद करता हूं कि दूसरे व्यक्ति को प्राथमिकता दी जाए, ताकि आप हमेशा मल्टीलाइन मोड में/आईएसएम के साथ रह सकें। [/ गलत]

मैं काफी दूर तक पढ़ा नहीं किया:
"/ s" और "/ मी" संशोधक दोनों $ * सेटिंग को ओवरराइड। इससे कोई फर्क नहीं पड़ता कि $ * क्या है, "/ s" बिना "/ m" स्ट्रिंग की शुरुआत में केवल "^" को मजबूर करेगा और "$" केवल अंत में मिलान करने के लिए (या केवल एक नई लाइन से पहले स्ट्रिंग का अंत)। साथ में,/एमएस के रूप में, उन्होंने "।" स्ट्रिंग के भीतर नई लाइनों के ठीक पहले और ठीक पहले, "^" और "$" को मिलान करने की अनुमति देते हुए, किसी भी चरित्र से मिलान करें।

+0

एचएम ... क्या यह सच है कि अगर हम 'एम' या 'एस' का उपयोग नहीं करते हैं, तो यह न तो एकाधिक रेखा और न ही एकल रेखा है? आपको लगता है कि यह एक या होना चाहिए। –

+0

वैसे, इसका वर्णन करने का यह तरीका^और $ के लिए एक संघर्ष करेगा यदि हम दोनों 'एम' और 'एस' का उपयोग करते हैं ... मैं PHP से डीफ़ का उपयोग कर रहा हूं ... तो शायद def एक है अन्य मंच पर थोड़ा अलग है। –

1

शायद इस तरह से, मैं कभी नहीं भूल जाएगा:

जब मैं लाइनों भर में मैच के लिए चाहते हैं, तो मैं स्वाभाविक रूप से सोचेंगे (आमतौर पर का उपयोग कर * कुछ फर्क नहीं पड़ता कि अगर यह कई लाइन पर होते हैं मैच के लिए।?) multiline, और इसलिए, 'एम'। खैर, 'एम' वास्तव में एक नहीं है, इसलिए यह है '।

(क्योंकि मुझे पहले से ही 'आईएसएम' याद है ... इसलिए मैं हमेशा याद रख सकता हूं कि यह 'एम' नहीं है, तो यह होना चाहिए)।

अन्य लंगड़ा प्रयास में शामिल हैं:

s DOTALL के लिए है, डॉट सभी मैच के लिए के लिए यह है।
m मल्टीलाइन है - यह कई बार मिलान करने के लिए ^ और $ के लिए है।

+3

एस "सुपर मैच" के लिए है, इसलिए आप अदृश्य पात्रों से भी मिलान कर सकते हैं;) – JimG

+0

@JimG जो सबसे मजेदार चीजों में से एक है जिसे मैंने कभी भी स्टैक ओवरफ्लो –

संबंधित मुद्दे