Ruby नियमित अभिव्यक्तियों में \ A \ z और ^ $ के बीच अंतर


196

प्रलेखन में मैंने पढ़ा:

स्ट्रिंग के प्रारंभ और अंत से मेल खाने के लिए \ A और \ z का उपयोग करें, ^ और $ एक लाइन के प्रारंभ / अंत से मेल खाते हैं।

मैं उपयोगकर्ता द्वारा प्रस्तुत उपयोगकर्ता नाम (या ई-मेल समान है) की जांच करने के लिए एक नियमित अभिव्यक्ति लागू करने जा रहा हूं। मुझे validates_format_ofमॉडल के साथ किस अभिव्यक्ति का उपयोग करना चाहिए ? मैं अंतर नहीं समझ सकता: मैंने हमेशा ^ और $ का उपयोग किया है ...


जवाबों:


226

यदि आप सत्यापन के लिए नियमित अभिव्यक्ति पर निर्भर हैं, तो आप हमेशा उपयोग करना चाहते हैं \Aऔर \z^और $केवल तब तक मेल खाएंगे जब तक कि एक newline वर्ण, जिसका अर्थ है कि वे किसी ईमेल का उपयोग कर सकते हैं me@example.com\n<script>dangerous_stuff();</script>और फिर भी यह मान्य है, क्योंकि regex केवल सब कुछ पहले देखता है \n

मेरी सिफारिश सिर्फ एक उपयोगकर्ता नाम या ईमेल से पूरी तरह से नई लाइनों को अलग करना होगा, क्योंकि एक के लिए कोई बहुत ही वैध कारण नहीं है। तब आप सुरक्षित रूप से EITHER \A \zया का उपयोग कर सकते हैं ^ $


13
@ रागमणि सही है, इसके \zबजाय छोटे अक्षर के साथ होना चाहिए \Z!
पेट्र

10
+1 धन्यवाद! यद्यपि मुझे आपकी सिफारिश से असहमत होना होगा: ए) यदि कोई उपयुक्त कैच-ऑल है, तो अनावश्यक कार्य / प्रसंस्करण को न जोड़ें और विशेष रूप से नहीं तो यदि यह आपको दोनों के बीच अंतर करने के बारे में आलसी बने रहने देता है। आप हमेशा केवल हेरफेर करने के लिए स्ट्रिंग हेरफेर करने की स्थिति में नहीं हो सकते हैं, इसलिए स्मृति के लिए सही अंतर करें और अंतर को जानें!
डोलियो

1
मुझे खतरनाक सामान के साथ उदाहरण समझ में नहीं आया क्योंकि या तो मामलों में कोई भी स्ट्रिंग में खतरनाक सामान को शामिल कर सकता है, नई लाइनों के साथ या बिना यह एक शोषण होगा जो कि html sanitizing और सत्यापन के साथ तय किया जाना चाहिए।
जयप्रकाश

2
@JayrMotta प्रदर्शन से पता चलता है कि खतरनाक सामान आपके संपूर्ण रेक्सक्स चेक को पूरी तरह से बायपास कर देगा । इसलिए यदि आप अपने रेगेक्स में खतरनाक सामान की जांच कर रहे थे, तो भी यह दरकिनार हो जाता था यदि आप $इसके बजाय "स्ट्रिंग के अंत" की जांच करते थे \z
डॉक्टर ब्लू

177

पिकैक्स के अनुसार :

^ एक पंक्ति की शुरुआत से मेल खाता है।

$ एक पंक्ति के अंत से मेल खाता है।

\A स्ट्रिंग की शुरुआत से मेल खाता है।

\z स्ट्रिंग के अंत से मेल खाता है।

\Z स्ट्रिंग के अंत से मेल खाता है जब तक कि स्ट्रिंग एक के साथ समाप्त नहीं होती है "\n", जिस स्थिति में यह उसके ठीक पहले मेल खाता है "\n"

तो, उपयोग \Aऔर लोअरकेस \z। यदि आप \Zकिसी का उपयोग करते हैं तो एक नए चरित्र में चुपके कर सकते हैं। यह खतरनाक नहीं है जो मुझे लगता है, लेकिन ऐसा हो सकता है कि एल्गोरिदम खराब हो जाए, जो यह मानता है कि स्ट्रिंग में कोई व्हाट्सएप नहीं है। आपके regex और string-length की कमी के आधार पर कोई व्यक्ति किसी अदृश्य नाम का उपयोग सिर्फ एक नई लाइन वर्ण के साथ कर सकता है।

रेक्स के जावास्क्रिप्ट का कार्यान्वयन \Aएक शाब्दिक 'A'( रेफरी ) के रूप में व्यवहार करता है । इसलिए खुद को वहां देखें और परखें।


16

किसी स्ट्रिंग का प्रारंभ और अंत आवश्यक रूप से एक पंक्ति के प्रारंभ और अंत के समान नहीं हो सकता है। कल्पना कीजिए कि आपने अपने परीक्षण स्ट्रिंग के रूप में निम्नलिखित का उपयोग किया है:

मेरे
नाम
है
एंड्रयू

ध्यान दें कि स्ट्रिंग में कई लाइनें हैं - द ^ और $वे वर्ण जो आप शुरुआत और उन पंक्तियों (मूल रूप से इलाज के अंत से मिलान करने के लिए अनुमति देने के \nएक delimeter के रूप में चरित्र), जबकि \Aऔर \Zआप शुरुआत और पूरे स्ट्रिंग के अंत से मिलान करने के लिए अनुमति देते हैं।


1
मेरी राय में सबसे अच्छा जवाब। "मूल रूप से एक परिधि के रूप में \ n चरित्र का इलाज" वास्तव में मुझे समझने में मदद करता है, धन्यवाद।
फ्लायआउट 91

11

उदाहरण से अंतर

  1. /^foo$/निम्नलिखित में से किसी से मेल खाता है, /\Afoo\z/नहीं:
whatever1
foo
whatever2
foo
whatever2
whatever1
foo
  1. /^foo$/और /\Afoo\z/सभी निम्नलिखित से मेल खाते हैं:
foo
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.