Regex ঠিক n বা m বার


105

নিম্নলিখিত রেগুলার এক্সপ্রেশন, যেখানে বিবেচনা Xকরা হয় কোনো Regex।

X{n}|X{m}

এই regex ঠিক বা সময় Xঘটতে পরীক্ষা করবে । nm

এমন কোনও রেজেক্স কোয়ানটিফায়ার রয়েছে যা ঘটনার জন্য Xঠিক সময় nবা mসময় পরীক্ষা করতে পারে ?


নং দুই occurences Xসেরা আপনি সাধারণ জন্য পেতে পারেন m, n
জন ডিভোরাক

এটি যদি আমার সমস্যা হয় তবে আমি পুনরায় সংস্থাগুলি চেষ্টা করে দেখতে শুরু করব (X)\1{n-1}(?:\1{m-n-1})। আমি এই ম্যাচগুলি Xকমপক্ষে একবারে জানি তবে কেবলমাত্র এই সাধারণ জিনিসটি শুরু করার জন্য তারপরে লুকহ্যাডগুলি বা লুকবিহিন্ডগুলি ব্যবহার করে পরিমার্জন করতে হবে (X)
স্পষ্টত

উত্তর:


91

কোনও একক কোয়ান্টিফায়ার নেই যার অর্থ হ'ল "ঠিক মি বা এন টাইমস"। আপনি যেভাবে এটি করছেন তা ঠিক আছে।

একটি বিকল্প হ'ল:

X{m}(X{k})?

কোথায় m < nএবং kএর মান n-m


67

কোয়ানটিফায়ারগুলির সম্পূর্ণ তালিকা এখানে রয়েছে (রেফারেশন : http://www.regular-expressions.info/references.html ):

  • ?, ??- 0 বা 1 টি ঘটনা ( ??অলস, ?লোভী)
  • *, *?- যে কোনও সংখ্যক ঘটনা
  • +, +?- কমপক্ষে একটি ঘটনা
  • {n}- ঠিক nঘটনা
  • {n,m}- nথেকে moccurences, সমেত
  • {n,m}?- nথেকে moccurences, অলস
  • {n,}, {n,}?- অন্তত nঘটনা

"ঠিক এন বা এম" পেতে, আপনাকে এম, এন বিশেষ না হলে দু'বার পরিমাণযুক্ত রেজেক্স লিখতে হবে:

  • X{n,m} যদি m = n+1
  • (?:X{n}){1,2} যদি m = 2n
  • ...

1
কেন ?:প্রয়োজন হয় m = 2nউদাহরণস্বরূপ? আমার কাছে এটি ছাড়া ভাল কাজ করা বলে মনে হচ্ছে।
erb

7
@ বার যদি আপনি চলে যান ?:তবে গ্রুপটি একটি ক্যাপচারিং গ্রুপে পরিণত হয়। রেজেক্স ইঞ্জিনটি মনে রাখার মতো জিনিসগুলি বাদ দিলে এটির পরে আপনার যদি গ্রুপ ক্যাপচার করে থাকে তবে তাদের আইডি পরিবর্তন হবে। আপনি যদি প্রতিস্থাপনের জন্য আপনার রেজেক্স ব্যবহার করেন তবে আপনাকে প্রতিস্থাপনটি সামঞ্জস্য করতে হবে।
জন ডিভোরাক


3

TLDR; (?<=[^x]|^)(x{n}|x{m})(?:[^x]|$)

দেখে মনে হচ্ছে আপনি "এক্সএন টাইম" বা "এক্সএম টাইম" চান, আমি মনে করি রেজেক্সের একটি আক্ষরিক অনুবাদ (x{n}|x{m}). এই https://regex101.com/r/vH7yL5/1 এর মতো হবে

অথবা, এমন ক্ষেত্রে যেখানে আপনার "এম" এক্স (এস এম> এন) এর বেশি ক্রম থাকতে পারে, আপনি 'নো' এক্স '' এবং '' এর পরে '' এক্স '' যোগ করতে পারবেন না তবে অনুবাদ করতে [^x](x{n}|x{m})[^x]পারবেন ধরে নিন যে আপনার "x" এর পিছনে এবং পরে সর্বদা একটি চরিত্র থাকে। আপনি এখানে দেখতে পারেন: https://regex101.com/r/bB2vH2/1

আপনি এটিকে (?:[^x]|^)(x{n}|x{m})(?:[^x]|$)"অনুসরণ করে 'এক্স' বা নিম্নলিখিত লাইন সূচনা" এবং "এর পরে 'কোন' এক্স 'বা লাইন শেষের পরে" অনুবাদ করতে পারেন। তবে এখনও, এটি কেবলমাত্র একটি চরিত্রের সাথে দুটি ক্রমের সাথে মেলে না (কারণ প্রথম ম্যাচের পরে একটি চরিত্রের প্রয়োজন হবে এবং দ্বিতীয়টি আগে একটি অক্ষর প্রয়োজন) আপনি এখানে দেখতে পারেন: https://regex101.com/r/ oC5oJ4 / 1

পরিশেষে, এক চরিত্রের দূরবর্তী ম্যাচের সাথে মিল রাখতে, আপনি "না 'x' পরে" বা "না 'x' এর আগে (? <=) এর পিছনে ইতিবাচক চেহারা যোগ করতে পারেন (? =) এটির মতো: https://regex101.com/r/mC4uX3/1

(?<=[^x]|^)(x{n}|x{m})(?:[^x]|$)

এইভাবে আপনি কেবলমাত্র 'x' এর পছন্দসই সংখ্যার সাথে মেলে।


1

এনহারডেনডের উত্তরে একবার দেখে তারা জানায় যে তাদের পেনাল্টিমেট এক্সপ্রেশন তাদের মধ্যে কেবল একটি চরিত্রের সাথে ক্রম মেলে না। সামনের দিকে তাকান / পিছনে তাকান না করে এটি ঠিক করার সহজ উপায় রয়েছে এবং এটি শুরু / শেষের অক্ষরটি সীমানা চরিত্রের সাথে প্রতিস্থাপন করবে। এটি আপনাকে শব্দের সীমাগুলির সাথে মিল দিতে দেয় যার মধ্যে শুরু / শেষ রয়েছে। এর মতো, যথাযথ প্রকাশটি হওয়া উচিত:

(?:[^x]|\b)(x{n}|x{m})(?:[^x]|\b)

আপনি এখানে দেখতে পারেন: https://regex101.com/r/oC5oJ4/2


1
কুল, আমি কীভাবে রেজেক্স সীমানা পরিচালনা করলাম তা সম্পর্কে আমার পরিচিত ছিল না। আপনি যখন একটি অ-মানক সীমানা ব্যবহার করছেন তখন এই পদ্ধতির একমাত্র সমস্যা। কাহিনী দেখুন: regex101.com/r/j0nkeo/1 এবং regex101.com/r/4Ix7Dr/1
এনহরনেডেড

1
@ এনহারডেনড - এটি একটি ভাল পয়েন্ট, একাধিক মিলে যাওয়া গ্রুপগুলির সাথে একটি সমস্যা বলে মনে হচ্ছে যা ওভারল্যাপ করে। এটি এমন একটি পরিস্থিতি যেখানে আপনাকে পিছনের চেহারাটি ব্যবহার করতে হবে।
rozza2058

1

খুব পুরানো পোস্ট, তবে আমি সহায়তা করতে চাই যে এইচটিএইচ অবদান রাখতে চাই। আমি প্রশ্নের যথাযথভাবে এটি চেষ্টা করেছি এবং এটি কাজ করে তবে একটি ধরা আছে: পরিমাণের ক্রমটি গুরুত্বপূর্ণ। এই বিবেচনা:

#[a-f0-9]{6}|#[a-f0-9]{3}

এটি হেক্স রঙের কোডের সমস্ত উপস্থিতি খুঁজে পাবে (সেগুলি 3 বা 6 ডিজিট দীর্ঘ হয়)। তবে আমি যখন এটিকে ঘিরে ফেলি তখন

#[a-f0-9]{3}|#[a-f0-9]{6}

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.