কেন [01-12] পরিসীমা আশানুরূপ কাজ করবে না?


95

আমি [01-12]দুটি অঙ্কের মিমি মেলানোর জন্য রেজেক্সে রেঞ্জ প্যাটার্নটি ব্যবহার করার চেষ্টা করছি , তবে এটি প্রত্যাশার মতো কাজ করে না।


9
আপনি অক্ষরের সাথে মিলছেন , চরিত্রের অনুক্রম নয় । মূলত, আপনি 0, 1 থেকে 1 এবং 2 এর সাথে মিল রেখেছেন (উদাঃ 0, 1 এবং 2)। এটি বিবেচনা [a-z0-9]করুন:, এটি সমস্ত ছোট হাতের অক্ষর এবং সমস্ত সংখ্যার সাথে মেলে তবে কেবল একটি একক চরিত্র হিসাবে।
লাসে ভি কার্লসেন

fww আমি একটি জাভাস্ক্রিপ্ট সরঞ্জাম তৈরি করেছি যা দুটি ইনপুট (ন্যূনতম / সর্বাধিক) github.com/jonschlinkert/to-regex-range
jonschlinkert

0 [1-9] | 1 [0-2] -> 0 | 1 | 2 -> [] গুলি একটি রেজেক্সে একটি অক্ষর শ্রেণি বোঝায়। যদি কোনও ব্যাপ্তি নির্দিষ্ট না করা থাকে তবে তা প্রতিটি চরিত্রকে স্পষ্টতই ors করে।
বদ্রি জিএস

আপনার কি এটি খাঁটি রেইগেক্সের সাথে মিলে যাওয়ার দরকার আছে? যদি তা না হয় তবে আপনি এটি করতে পারেন: 1.) কেবলমাত্র \d+প্যাটার্নটি ব্যবহার করুন , ২) আপনার কোডের সাথে ম্যাচযুক্ত স্ট্রিংগুলিকে সংখ্যায় রূপান্তর করুন। এবং তারপরে, ৩) এর মতো নম্বর পরিসীমাটি পরীক্ষা করে দেখুন if(num >= 0 && num <= 12){ /*do something*/ }। এটি এত দ্রুত এবং নমনীয়।
এজেস হয়েছে

উত্তর:


205

রেজেক্সে অক্ষর শ্রেণির সংজ্ঞা কীভাবে কাজ করে তা আপনি ভুল বুঝে গেছেন বলে মনে হয়।

স্ট্রিং কোনো মেলে 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, অথবা 12, এই কাজ ভালো কিছু:

0[1-9]|1[0-2]

তথ্যসূত্র


ব্যাখ্যা

একটি অক্ষর শ্রেণি নিজে থেকে ইনপুট স্ট্রিং থেকে একটি এবং ঠিক একটি অক্ষরের সাথে মেলে চেষ্টা করে । [01-12]আসলে সংজ্ঞায়িত [012], একটি অক্ষর বর্গ যে 3 টি অক্ষর কোন বিরুদ্ধে ইনপুট থেকে একটি অক্ষর মিলে যায় 0, 1অথবা 2

-পরিসর সংজ্ঞা থেকে যায় 1কাছে 1, যা শুধু অন্তর্ভুক্ত 1। অন্যদিকে, কিছু [1-9]অন্তর্ভুক্ত 1, 2, 3, 4, 5, 6, 7, 8, 9

প্রাথমিকভাবে প্রায়শই জিনিসগুলি সংজ্ঞায়িত করার ভুল করে [this|that]। এটি "কাজ" করে না। এই অক্ষর সংজ্ঞা সংজ্ঞায়িত [this|a], IE এতে 6 অক্ষর কোন বিরুদ্ধে ইনপুট থেকে একটি অক্ষর মিলে যায় t, h, i, s, |বা a। সম্ভাবনার চেয়ে বেশি (this|that)হ'ল উদ্দেশ্য is

তথ্যসূত্র


রেঞ্জগুলি কীভাবে সংজ্ঞায়িত করা হয়

সুতরাং এটি এখন সুস্পষ্ট যে একটি প্যাটার্নটি between [24-48] hours"কাজ করে না" like এই ক্ষেত্রে চরিত্র শ্রেণি সমান [248]

এটি হ'ল -একটি চরিত্রের শ্রেণীর সংজ্ঞা প্যাটার্নে সংখ্যার পরিসীমা নির্ধারণ করে না। সীমাবদ্ধ পুনরাবৃত্তি বাক্য গঠন (যেমন a{3,5}3 এবং 5 এর মধ্যে ম্যাচ a) ব্যতীত রেজেক্স ইঞ্জিনগুলি প্যাটার্নে প্রকৃতপক্ষে সংখ্যাকে "বুঝতে" পারে না ।

ব্যাপ্তি সংজ্ঞা পরিবর্তে ব্যাপ্তিগুলি সংজ্ঞায়িত করতে অক্ষরগুলির ASCII / ইউনিকোড এনকোডিং ব্যবহার করে। অক্ষরটি 0দশমিক 48 হিসাবে ASCII এ এনকোড করা হয়েছে; 957. সুতরাং, অক্ষর সংজ্ঞায় [0-9]এমন সমস্ত অক্ষর অন্তর্ভুক্ত থাকে যার মান দশমিক 48 এবং 57 এর মধ্যে এনকোডিংয়ের মধ্যে। বরং বুদ্ধিমানের, নকশা দ্বারা এই অক্ষর 0, 1, ..., 9

আরো দেখুন


আর একটি উদাহরণ: এ টু জেড

আসুন আরেকটি সাধারণ চরিত্র শ্রেণির সংজ্ঞাটি একবার দেখে নিই [a-zA-Z]

এএসসিআইআইতে:

  • A= 65, Z= 90
  • a= 97, z= 122

এই যে মানে:

  • [a-zA-Z]এবং [A-Za-z]সমতুল্য
  • বেশিরভাগ স্বাদে, [a-Z]এটি একটি অবৈধ চরিত্রের ব্যাপ্তি হতে পারে
    • কারণ a() Z৯) (90) এর চেয়ে "বড়"
  • [A-z] আইনী, তবে এই ছয়টি অক্ষরও অন্তর্ভুক্ত রয়েছে:
    • [(91), \(92), ](93), ^(94), _(95), `(96)

সম্পর্কিত প্রশ্নাবলী


আমার জন্য, আমি সিঙ্গেল ডিজিট যদি 0 দিয়ে উপসর্গ না করে কয়েক মাস খুঁজছিলাম। এবং আমি এটি ([1-9] | (1 [0-2])) ব্যবহার করেছি এবং এটি কার্যকর হয়।
বুঞ্জিবি

4
লক্ষণীয় গুরুত্বপূর্ণ: আপনি যদি এই পৃষ্ঠাটি দশকের কাছে যাওয়ার আগে কেবলমাত্র একক সংখ্যা রয়েছে এমন আপনার নম্বর পরিসীমাটির সমাধান চান তবে এটি কার্যকর 0[1-9]|1[0-2]হবে না। লজিক্যাল পরবর্তী ধাপে এটিকে পরিবর্তন করা [1-9]|1[0-2]বোধগম্য কারণে (এটি মিলে যায়, হয় কাজ করছে না 1শুধুমাত্র 10, 11এবং, 12)। \b(?:[0-9]|1[0-1])\bতা রোধ করতে ব্যবহার করতে হয়েছিল। \bএর নিশ্চিত করে রেজেক্স শব্দের সাথে মেলে (বা এই ক্ষেত্রে সংখ্যায়) সীমানা ( ^& $না); বন্ধনীগুলি এর (ও |) দিকটিকে অন্যদিকে বিবেচনা করে; এবং অবশেষে ?:বন্ধনী ব্যবহার করে একটি সাবম্যাচ তৈরি করা নয়।
ব্যবহারকারী 66001

@ পলিজেলেনব্রিক্যান্টস: "1,2,3,4,5,6,7,8,9,10,17,18".match(/^(([1-9]|1[0-7])\,?)+$/g )আপনি কি দয়া করে আমাকে বলতে পারেন কেন এই জেএস রেজেক্সটি 17 এর উপরে মেলে?
এডাম

@edam - polygenelubricants, এবং তাই আমি, কিন্তু তারপর আমরা হতে চাই পারে পারে উত্তর একটি questi ... অপেক্ষা করুন ... এই একটি হল প্রশ্ন আপনি একটি মধ্যে জিজ্ঞাসা করা হয় মন্তব্য ? আছে rulez এই সাইটে;) একটি প্রশ্ন জিজ্ঞাসা করুন যদি আপনি একটি নতুন প্রশ্ন আছে। মন্তব্যগুলি কেবল সমালোচনা এবং স্পষ্টতা জিজ্ঞাসা করার জন্য, এবং তাদের প্রতিক্রিয়া জানাতে for
রবিন্টিসটি

4
@ এডাম ওহ, আমি দেখছি আপনি হয়নি এটি একটি প্রশ্ন এক ঘণ্টা পরে যেমন পুনরায় জিজ্ঞাসা। দারুণ! তবে আপনার মন্তব্যটি এখানে মুছে ফেলা ভাল ধারণা হবে।
রবিন্টিস

24

[...]সিনট্যাক্স দ্বারা চিহ্নিত নিয়মিত অভিব্যক্তিগুলিতে একটি অক্ষর শ্রেণি ইনপুটটিতে একটি একক চরিত্রের সাথে মেলে নিয়মগুলি নির্দিষ্ট করে । যেমনটি, বন্ধনীগুলির মধ্যে আপনি যা লেখেন সেগুলি একটি একক অক্ষরের সাথে কীভাবে মিলবে তা নির্দিষ্ট করে ।

আপনার নিদর্শন, [01-12]এভাবে নীচে ভেঙে গেছে:

  • 0 - একক অঙ্ক 0 সাথে মেলে
  • বা, 1-1, 1 থেকে 1 এর মধ্যে একক অঙ্কের সাথে মেলে
  • বা, 2, একক অঙ্ক 2 এর সাথে মেলে

সুতরাং মূলত আপনি যা মিলছেন তা 0, 1 বা 2।

০১-১২ থেকে শুরু করে সংখ্যা হিসাবে দুটি সংখ্যার সাথে মিল রেখে আপনি যে ম্যাচিং করতে চান তা করতে, আপনাকে কীভাবে পাঠ্য হিসাবে দেখাবে সে সম্পর্কে আপনাকে ভাবতে হবে।

তোমার আছে:

  • 01-09 (যেমন প্রথম সংখ্যাটি 0, দ্বিতীয় সংখ্যা 1-9)
  • 10-12 (যেমন প্রথম সংখ্যাটি 1, দ্বিতীয় সংখ্যা 0-2)

তারপরে আপনাকে তার জন্য একটি নিয়মিত প্রকাশ লিখতে হবে, যা দেখতে এটি দেখতে পারে:

  +-- a 0 followed by 1-9
  |
  |      +-- a 1 followed by 0-2
  |      |
<-+--> <-+-->
0[1-9]|1[0-2]
      ^
      |
      +-- vertical bar, this roughly means "OR" in this context

নোট করুন যে একটি সংক্ষিপ্ত এক্সপ্রেশন পাওয়ার জন্য তাদের একত্রিত করার চেষ্টা করা ব্যর্থ হবে, অবৈধ ইনপুটটির জন্য মিথ্যা ইতিবাচক ম্যাচ দিয়ে।

উদাহরণস্বরূপ, প্যাটার্নটি [0-1][0-9]মূলত 00-19 সংখ্যার সাথে মিলবে যা আপনি যা চান তার চেয়ে কিছুটা বেশি।

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


9

এটিও কাজ করে:

^([1-9]|[0-1][0-2])$

[1-9] 1 এবং 9 এর মধ্যে একক সংখ্যার সাথে মেলে

[0-1][0-2] 10 এবং 12 এর মধ্যে ডাবল ডিজিট মেলে

এখানে কিছু ভাল উদাহরণ আছে


4
হুবহু হ'ল [0-1][0-2]মেলে 00। এটি বলেছিল, লিঙ্কটির জন্য +1 (যা আমি আমার উত্তরে ব্যবহার করেছি)।
বহুবৃক্ষীয় পদার্থ

4
[0-1][0-2]সাবধানে ব্যাখ্যা করা আবশ্যক, যেমন স্ট্রিং পছন্দ পারবেন 00, 01এবং 02, কিন্তু এটা সত্য বলিয়া স্বীকার করা না 03পর্যন্ত 09, অবশেষে স্বীকার 10, 11এবং 12। এর জন্য একটি ডান রেইজেক্স [1-9]|1[0-2]বা এমনকি 0*([1-9]|1[0-2])(এটি সর্বশেষ সংখ্যক নেতৃস্থানীয় শূন্যকে অনুমতি দেয়)।
লুইস কলোরাডো

1

[]একটি বোঝাতে একটি Regex মধ্যে গুলি চরিত্র শ্রেণী । যদি কোনও ব্যাপ্তি নির্দিষ্ট না করা থাকে তবে তা স্পষ্টভাবে বা এর মধ্যে থাকা প্রতিটি চরিত্রকে এক সাথে করে দেয়। সুতরাং, [abcde]এটি হিসাবে একই (a|b|c|d|e), এটি কিছুই ক্যাপচার না; এটা যে কোনো একটি ম্যাচ হবে a, b, c, d, অথবা e। সমস্ত পরিসীমা নির্দেশিত অক্ষরের একটি সেট ; [ac-eg]"যেকোন একটির সাথে মেলে a:; cএবং এর মধ্যে যে কোনও চরিত্র e; বা g" says সুতরাং, আপনার ম্যাচটি বলছে "যেকোন একটির সাথে মেলে 0:; 1এবং 1( যেমন , ন্যায়সঙ্গত 1) এর মধ্যে যে কোনও অক্ষর ; বা 2

আপনার লক্ষ্যটি স্পষ্টতই একটি সংখ্যার ব্যাপ্তি নির্দিষ্ট করতে হবে: দুটি অঙ্কের মধ্যে 01এবং 12লিখিত যে কোনও সংখ্যা । এই নির্দিষ্ট ক্ষেত্রে, আপনি এটি দিয়ে মেলাতে পারে 0[1-9]|1[0-2]: হয় একটি 0মধ্যে কোনো অঙ্ক দ্বারা অনুসরণ 1এবং 9, অথবা একটি 1মধ্যে কোনো অঙ্ক দ্বারা অনুসরণ 0এবং 2। সাধারণভাবে, আপনি যে কোনও সংখ্যার পরিসরকে বৈধ রেজেক্সে একইভাবে রূপান্তর করতে পারেন। নিয়মিত প্রকাশের চেয়ে আরও ভাল বিকল্প হতে পারে, বা বিদ্যমান ফাংশন বা মডিউল যা আপনার জন্য রেইগেক্স তৈরি করতে পারে। এটি আপনার ভাষার উপর নির্ভর করে।


0

যেহেতু পলিলেগেনুব্রিকেন্টস বলেছে আপনার স্ট্রিংয়ের পরিবর্তে অক্ষরের সাথে অক্ষর মেলে এমন চরিত্রের ক্লাসগুলি [[]] এর জিনিসগুলির চেয়ে আপনি যা চান তার চেয়ে 0 | 1-1 | 2 সন্ধান করবেন।


4
0|1-1|2- এই স্বরলিপিটি খুব বিভ্রান্তিকর। এর মতো কিছু 0|1|2আরও সঠিক হবে।
বহুবৃক্ষীয় পদার্থ

0

এটা ব্যবহার কর:

0?[1-9]|1[012]
  • 07: বৈধ
  • 7: বৈধ
  • 0: মিলছে না
  • 00: মিলছে না
  • 13: মিলছে না
  • 21: মিলছে না

07/2018 হিসাবে কোনও প্যাটার্নটি পরীক্ষা করতে এটি ব্যবহার করুন:

/^(0?[1-9]|1[012])\/([2-9][0-9]{3})$/

(তারিখের সীমা 01/2000 থেকে 12/9999 এর মধ্যে)


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