একটি রেজেজেমে স্কোয়ার বন্ধনী এবং বন্ধনীগুলির মধ্যে পার্থক্য কী?


101

আমি জাভাস্ক্রিপ্টে ব্যবহার করার জন্য তৈরি একটি নিয়মিত প্রকাশ:

var reg_num = /^(7|8|9)\d{9}$/

আমার টিম মেম্বার প্রস্তাবিত আরেকটি এখানে।

var reg_num = /^[7|8|9][\d]{9}$/

একটি ফোন নম্বর যাচাই করার নিয়মটি হল:

  • এটি কেবল দশ সংখ্যার হওয়া উচিত।
  • প্রথম সংখ্যাটি 7, 8 বা 9 এর যেকোনও বলে মনে করা হচ্ছে।

উত্তর:


124

এই regexes সমতুল্য (ম্যাচের উদ্দেশ্যে):

  • /^(7|8|9)\d{9}$/
  • /^[789]\d{9}$/
  • /^[7-9]\d{9}$/

ব্যাখ্যা:

  • (a|b|c)একটি রেজেক্স "ওআর" এবং এর অর্থ "এ বা বি বা সি", যদিও ওআর এর জন্য প্রয়োজনীয় বন্ধনীগুলির উপস্থিতিও অঙ্কটি ক্যাপচার করে। কঠোরভাবে সমতুল্য হতে, আপনি (?:7|8|9)এটি একটি নন ক্যাপচারিং গ্রুপ হিসাবে কোড করতে হবে ।

  • [abc]একটি "অক্ষর শ্রেণি" যার অর্থ "a, b বা c এর যে কোনও অক্ষর" (একটি অক্ষর শ্রেণি ব্যাপ্তি ব্যবহার করতে পারে, উদাহরণস্বরূপ [a-d]= [abcd])

এই রেজেক্সগুলি সমান হওয়ার কারণটি হ'ল একটি চরিত্র শ্রেণি একটি "বা" (তবে কেবলমাত্র একক অক্ষরের জন্য) শর্টহ্যান্ড। একটি বিকল্পে, আপনি এমন কিছু করতেও পারেন (abc|def)যা একটি চরিত্র শ্রেণিতে অনুবাদ করে না।


30
(7|8|9)এবং [789]সমতুল্য নয়, কারণ প্রথমটি ক্যাপচার করছে, পরেরটি নয়। (?:7|8|9)অন্যদিকে সমান হবে (আমার ধারণা আপনি অবশ্যই জানেন যে ...)।
hochl

আমি এই Regex এইজন্য করছি: [<<|>>|\]\]|\[\[]। প্রসঙ্গের কারণে, আমি জানি যে রেজেক্স মেলানোর চেষ্টা করছে <<বা >>বা [[বা ]]। কিন্তু আপনি কি বলেন করেছি থেকে, এটা ম্যাচিং হওয়া উচিত <বা >বা [বা ]। আপনি যদি এর |মধ্যে ব্যবহার করেন []তবে বন্ধনীগুলি কী আলাদা আচরণ করে?
ড্যানিয়েল ক্যাপলান

1
@ ড্যানিয়েলক্যাপলান |অক্ষর শ্রেণীর মধ্যে ব্যবহার করবেন না [...], যদি না আপনি পাইপ চরিত্রের সাথে নিজেই মিল করতে চান। একটি অক্ষর শ্রেণিতে অক্ষরের অনুলিপি করার কোনও প্রভাব নেই - একটি অক্ষর শ্রেণি হ'ল অক্ষরের একটি তালিকা এবং এর মধ্যে একটির সাথে মিলবে। আমার অনুমান যে আপনি এমন একটি গ্রুপ চান যা সাধারণ রাউন্ড বন্ধনী ব্যবহার করে:(<<|>>|\]\]|\[\[)
বোহেমিয়ান

57

আপনার দলের পরামর্শটি প্রায় সঠিক, ভুলটি বাদ দেওয়া হয়েছে except একবার আপনি কেন এটি খুঁজে বের করলে, আপনি কখনই তা ভুলে যাবেন না। এই ভুলটি একবার দেখুন।

/^(7|8|9)\d{9}$/

এটি কী করে:

  • ^এবং $অ্যাঙ্করড ম্যাচগুলি বোঝায়, যা দাবি করে যে এই অ্যাঙ্গারগুলির মধ্যে থাকা সাবপ্যাটার্নটি পুরো ম্যাচ। স্ট্রিংটি কেবল তখনই মিলবে যদি সাব প্যাটার্নগুলি কেবলমাত্র একটি বিভাগ নয়, এর সম্পূর্ণতার সাথে মেলে।
  • ()ক্যাপচারিং গ্রুপকে বোঝায় ।
  • 7|8|9উল্লেখ করে উভয় মিলে 7, 8অথবা 9। এটি বিকল্পগুলির সাথে এটি করে , যা পাইপ অপারেটরটি |করে - বিকল্পগুলির মধ্যে পর্যায়ক্রমে। বিকল্পগুলির মধ্যে এই ব্যাকট্র্যাকস: প্রথম বিকল্পটি যদি না মিলে যায় তবে পরের বিকল্পটির সাথে ম্যাচ চালিয়ে যাওয়ার জন্য ইঞ্জিনটিকে বিকল্পের ম্যাচের সময় পয়েন্টারের অবস্থানটি সরিয়ে নেওয়ার আগে ফিরে আসতে হবে; যেখানে চরিত্র শ্রেণি ক্রমান্বয়ে অগ্রসর হতে পারে। অপটিমাইজেশন অক্ষম করে একটি রেজেক্স ইঞ্জিনে এই ম্যাচটি দেখুন:
Pattern: (r|f)at
Match string: carat

পরিবর্তনও

Pattern: [rf]at
Match string: carat

শ্রেণী

  • \d{9}নয়টি সংখ্যার সাথে মেলে। \dএকটি শর্টহ্যান্ডেড মেটাচার্যাক্টর, যা কোনও সংখ্যার সাথে মেলে।
/^[7|8|9][\d]{9}$/

এটি কি করে দেখুন:

  • ^এবং $অ্যাঙ্কার্ড ম্যাচগুলিও বোঝায়।
  • [7|8|9]একটি চরিত্র শ্রেণি । তালিকা থেকে যে কোন অক্ষর 7, |, 8, |, অথবা 9ম্যাচ খেলতে পারে, এইভাবে |ভুল মধ্যে যোগ করা হয়েছিল। ব্যাকট্রাকিং ছাড়াই এটি মেলে।
  • [\d]একটি চরিত্র শ্রেণি যা মেটাচ্যারেক্টারে বাস করে \d। একটি অক্ষর শ্রেণীর এবং একটি একক মেটাচার্যাক্টারের ব্যবহারের সংমিশ্রণটি একটি খারাপ ধারণা, যাইহোক, বিমূর্ততার স্তরটি ম্যাচটি কমিয়ে আনতে পারে তবে এটি কেবল একটি বাস্তবায়ন বিশদ এবং কেবল কয়েকটি রেজেক্স বাস্তবায়নের ক্ষেত্রে প্রযোজ্য। জাভাস্ক্রিপ্ট এক নয়, তবে এটি সাবপ্যাটার্নটি কিছুটা দীর্ঘ করে দেয়।
  • {9} পূর্ববর্তী একক নির্মাণটি মোট নয় বার পুনরাবৃত্তি হয়েছে তা নির্দেশ করে।

অনুকূল রেজেেক্স /^[789]\d{9}$/কারণ, কারণ/^(7|8|9)\d{9}$/ অহেতুক ক্যাপচারগুলি যা বেশিরভাগ রেইজেক্স বাস্তবায়নের ক্ষেত্রে কার্যকারিতা হ্রাস চাপিয়ে দেয় (প্রশ্নটি varকোডে কীওয়ার্ড ব্যবহার করে বিবেচনা করে এক হতে পারে এটি সম্ভবত জাভাস্ক্রিপ্ট)। এর ব্যবহারযা পিসিআরই-তে প্রি ম্যাচিংয়ের জন্য চালিত হয় তা ব্যাকট্রাকিংয়ের অভাব দূর করে দেয়, তবে আমরা হয় পিএইচপিতে নেই, সুতরাং []পরিবর্তনের পরিবর্তে ক্লাস ব্যবহার করা |ম্যাচ ব্যাকট্র্যাক না হওয়ায় পারফরম্যান্স বোনাস দেয় এবং তাই উভয় ম্যাচ এবং আপনার ব্যবহারের চেয়ে দ্রুত ব্যর্থ হয় পূর্ববর্তী নিয়মিত প্রকাশ।


6
মাত্র আগ্রহের বাইরে, সেই স্ক্রিনশটটি কোন প্রোগ্রাম থেকে এসেছে?
মিস্টার রহস্য অতিথি

12

আপনি যদি কোনও কিছু দ্বারা সেটিকে প্রতিস্থাপন করছেন তবে প্রথম 2 টি উদাহরণ খুব আলাদাভাবে কাজ করে। আপনি যদি এটির সাথে মেলে:

str = str.replace(/^(7|8|9)/ig,''); 

আপনি খালি স্ট্রিং দ্বারা 7 বা 8 বা 9 প্রতিস্থাপন করবে।

যদি আপনি এটি মেলে

str = str.replace(/^[7|8|9]/ig,''); 

আপনি প্রতিস্থাপন করবেন 7বা 8বা 9ভার্টিকাল বার !!!! খালি স্ট্রিং দ্বারা

আমি এই কঠিন উপায় খুঁজে পেয়েছি।


6
তাই আপনাকে স্বাগতম! প্রতিস্থাপন বা মিলে যাওয়া, এটি কেবল সাধারণ ভুল। প্রচুর লোকেরা এটি ভুল করে এবং তারা সাধারণত বছরের পর বছর - কখনও কখনও এটি থেকে দূরে চলে যায় কারণ তাদের ইনপুট স্ট্রিংগুলিতে কখনও পাইপ ( |) থাকে না।
অ্যালান মুর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.