রুবি নিয়মিত প্রকাশে \ A \ z এবং ^ between এর মধ্যে পার্থক্য


196

ডকুমেন্টেশনে আমি পড়েছি:

স্ট্রিংয়ের শুরু এবং শেষের সাথে মেলে ধরতে \ A এবং \ z ব্যবহার করুন, ^ এবং $ একটি লাইনের শুরু / শেষের সাথে মেলে।

আমি ব্যবহারকারীর দ্বারা জমা দেওয়া ব্যবহারকারীর নাম (বা ই-মেইল একই) যাচাই করতে একটি নিয়মিত অভিব্যক্তি প্রয়োগ করতে যাচ্ছি। validates_format_ofমডেলটিতে আমার কোন অভিব্যক্তিটি ব্যবহার করা উচিত ? আমি পার্থক্যটি বুঝতে পারি না: আমি সর্বদা ^ এবং $ ... ব্যবহার করেছি


উত্তর:


226

আপনি যদি বৈধতার জন্য নিয়মিত প্রকাশের উপর নির্ভর করে থাকেন তবে আপনি সর্বদা ব্যবহার করতে চান \Aএবং \z^এবং $কেবলমাত্র একটি নতুন লাইন চরিত্রের সাথে মিলবে, যার অর্থ তারা একটি ইমেলটি ব্যবহার করতে পারত me@example.com\n<script>dangerous_stuff();</script>এবং এখনও এটির বৈধতা পেতে পারে, যেহেতু রেজেক্স কেবল সমস্ত কিছু আগে দেখেন \n

আমার প্রস্তাবনাটি পুরোপুরি আগেই ব্যবহারকারীর নাম বা ইমেল থেকে সম্পূর্ণ নতুন লাইনগুলি কেটে ফেলবে, কারণ এর কোনও বৈধ কারণ নেই। তারপরে আপনি নিরাপদে EITHER \A \zবা ^ $


13
@ রাগমণির ঠিক আছে, এটি \zপরিবর্তে ছোট চিঠি দিয়ে থাকা উচিত \Z!
পেটর

10
+1 ধন্যবাদ! যদিও আমাকে আপনার প্রস্তাবের সাথে একমত হতে হবে: ক) যথাযথ ক্যাচ-অল থাকলে অপ্রয়োজনীয় কাজ / প্রক্রিয়াকরণ যুক্ত করবেন না এবং খ) বিশেষত যদি তা আপনাকে দুজনের মধ্যে পার্থক্য সম্পর্কে অলস থাকতে দেয় তবে না। আপনি সবসময় স্ট্রিং ম্যানিপুলেট করার মতো অবস্থানে নাও থাকতে পারেন, কেবল রেইজেক্সের কাছে, তাই সঠিকটিকে স্মৃতিতে প্রতিশ্রুতিবদ্ধ করুন এবং পার্থক্যটি জানেন!
ডোলিও

1
আমি বিপজ্জনক স্টাফ সহ উদাহরণটি বুঝতে পারি নি কারণ উভয় ক্ষেত্রেই কেউ স্ট্রিংয়ের মধ্যে বিপজ্জনক জিনিসগুলি অন্তর্ভুক্ত করতে পারে, নতুন লাইন সহ বা ছাড়া এটি এটি একটি শোষণ হবে যা এইচটিএমএল স্যানিটাইজিং এবং বৈধতা দিয়ে স্থির করা উচিত।
জেআর মোত্তা

2
@ জায়ারমোট্টা যা এই প্রদর্শনীটি দেখায় তা হ'ল বিপজ্জনক উপাদানগুলি আপনার সম্পূর্ণ রেজেক্স চেককে পুরোপুরি বাইপাস করবে । সুতরাং আপনি যদি নিজের রেজেক্সে বিপজ্জনক জিনিসগুলি পরীক্ষা করে দেখছিলেন, আপনি যদি $"স্ট্রিংয়ের শেষ" না করে পরীক্ষা করে ব্যবহার করেন তবে এটি বাইপাস হয়ে যাবে \z
ডক্টর ব্লু

177

পিকাক্সের মতে :

^ একটি লাইনের শুরুর সাথে মেলে।

$ একটি লাইনের শেষের সাথে মেলে।

\A স্ট্রিংয়ের শুরুটির সাথে মেলে।

\z স্ট্রিংয়ের শেষের সাথে মেলে।

\Z স্ট্রিংটি একটি এর সাথে শেষ না হওয়া পর্যন্ত স্ট্রিংয়ের শেষের সাথে "\n"মেলে, সেক্ষেত্রে এটির ঠিক আগে মেলে "\n"

সুতরাং, ব্যবহার \Aএবং ছোট হাতের অক্ষর \z। আপনি যদি \Zকেউ ব্যবহার করেন তবে একটি নতুন লাইনের চরিত্রটি ছিনিয়ে নিতে পারে। এটি আমার মনে হয় বিপজ্জনক নয়, তবে সম্ভবত এমন অ্যালগোরিদমগুলি ছড়িয়ে দিতে পারে যা ধরে নেয় যে স্ট্রিংয়ের কোনও সাদা অংশ নেই। আপনার রেজেক্স এবং স্ট্রিং-দৈর্ঘ্যের সীমাবদ্ধতার উপর নির্ভর করে কেউ কেবল একটি নতুনলাইন চরিত্রের সাথে একটি অদৃশ্য নাম ব্যবহার করতে পারে।

জাভাস্ক্রিপ্টের রেগেক্সের বাস্তবায়ন \Aআক্ষরিক 'A'( রেফ ) হিসাবে বিবেচনা করে । সুতরাং সেখানে নিজেকে দেখুন এবং পরীক্ষা।


16

কোনও স্ট্রিংয়ের শুরু এবং শেষ প্রান্তে কোনও লাইনের শুরু এবং শেষের মতো একই জিনিস নাও হতে পারে। আপনি যদি পরীক্ষার স্ট্রিং হিসাবে নিম্নলিখিতটি ব্যবহার করেন তা কল্পনা করুন:

আমার
নাম
হল
অ্যান্ড্রু

লক্ষ্য করুন যে স্ট্রিংটিতে অনেকগুলি রেখা রয়েছে - ^এবং $অক্ষরগুলি আপনাকে সেই লাইনের শুরু এবং শেষের সাথে মুলত অনুমতি দেয় (মূলত \nচরিত্রটিকে একটি ডেলিমিটার হিসাবে বিবেচনা করে ) \Aএবং \Zআপনাকে পুরো স্ট্রিংয়ের শুরু এবং শেষের সাথে মেলাতে দেয়।


1
আমার মতে সেরা উত্তর। "মূলত character n চরিত্রটিকে একটি বিস্ময়কর হিসাবে বিবেচনা করা" সত্যই আমাকে বুঝতে সাহায্য করেছে, আপনাকে ধন্যবাদ।
ফ্লাইআউট 91

11

উদাহরণ দ্বারা পার্থক্য

  1. /^foo$/নিম্নলিখিত যে কোনওটির সাথে মেলে, এর সাথে /\Afoo\z/মিলছে না:
whatever1
foo
whatever2
foo
whatever2
whatever1
foo
  1. /^foo$/এবং /\Afoo\z/সমস্ত নীচের সাথে মেলে:
foo
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.