কীভাবে ক্যাপচার না করা গ্রুপগুলি, যেমন (?:)
নিয়মিত প্রকাশে ব্যবহৃত হয় এবং তারা কীসের জন্য ভাল?
কীভাবে ক্যাপচার না করা গ্রুপগুলি, যেমন (?:)
নিয়মিত প্রকাশে ব্যবহৃত হয় এবং তারা কীসের জন্য ভাল?
উত্তর:
আমি এটি একটি উদাহরণ দিয়ে ব্যাখ্যা করার চেষ্টা করি।
নিম্নলিখিত পাঠ্য বিবেচনা করুন:
http://stackoverflow.com/
/programming/tagged/regex
এখন, আমি যদি এটির উপরে নীচে রেজেক্স প্রয়োগ করি ...
(https?|ftp)://([^/\r\n]+)(/[^\r\n]*)?
... আমি নিম্নলিখিত ফলাফল পেতে হবে:
Match "http://stackoverflow.com/"
Group 1: "http"
Group 2: "stackoverflow.com"
Group 3: "/"
Match "/programming/tagged/regex"
Group 1: "https"
Group 2: "stackoverflow.com"
Group 3: "/questions/tagged/regex"
তবে আমি প্রোটোকলটির বিষয়ে চিন্তা করি না - আমি কেবল ইউআরএল এর হোস্ট এবং পথ চাই। সুতরাং, আমি অ-ক্যাপচারিং গ্রুপকে অন্তর্ভুক্ত করার জন্য রেজেক্সটি পরিবর্তন করেছি (?:)
।
(?:https?|ftp)://([^/\r\n]+)(/[^\r\n]*)?
এখন, আমার ফলাফলটি এরকম দেখাচ্ছে:
Match "http://stackoverflow.com/"
Group 1: "stackoverflow.com"
Group 2: "/"
Match "/programming/tagged/regex"
Group 1: "stackoverflow.com"
Group 2: "/questions/tagged/regex"
দেখা? প্রথম দলটি ধরা পড়েনি। পার্সার এটি পাঠ্যের সাথে মেলে ব্যবহার করে তবে চূড়ান্ত ফলাফলের পরে এটিকে উপেক্ষা করে।
অনুরোধ অনুসারে, আমাকেও গ্রুপগুলি ব্যাখ্যা করার চেষ্টা করা যাক।
ওয়েল, গ্রুপগুলি বিভিন্ন উদ্দেশ্যে পরিবেশন করে। তারা আপনাকে বৃহত্তর ম্যাচ থেকে সঠিক তথ্য বের করতে সহায়তা করতে পারে (যার নামও দেওয়া যেতে পারে), তারা আপনাকে আগের ম্যাচ করা গোষ্ঠীর পুনরায় ম্যাচ করতে দেয় এবং বিকল্পগুলির জন্য ব্যবহার করা যেতে পারে। আসুন কিছু উদাহরণ চেষ্টা করি, আমরা কি করব?
আপনার কোনও ধরণের এক্সএমএল বা এইচটিএমএল রয়েছে তা কল্পনা করুন (সচেতন হন যে রেজেক্স এই কাজের জন্য সেরা সরঞ্জাম নাও হতে পারে , তবে এটি উদাহরণ হিসাবে দুর্দান্ত)। আপনি ট্যাগগুলি বিশ্লেষণ করতে চান, যাতে আপনি এরকম কিছু করতে পারেন (এটি বুঝতে আরও সহজ করার জন্য আমি স্পেস যুক্ত করেছি):
\<(?<TAG>.+?)\> [^<]*? \</\k<TAG>\>
or
\<(.+?)\> [^<]*? \</\1\>
প্রথম রেজেক্সের একটি নামী গোষ্ঠী রয়েছে (TAG), যখন দ্বিতীয়টি একটি সাধারণ গ্রুপ ব্যবহার করে। উভয় রেজেক্স একই কাজ করে: তারা ক্লোজিং ট্যাগটির সাথে মেলে প্রথম গ্রুপের (ট্যাগটির নাম) মান ব্যবহার করে। পার্থক্যটি হ'ল প্রথমটি নামের সাথে মিলের জন্য নামটি ব্যবহার করে এবং দ্বিতীয়টি গ্রুপ সূচক ব্যবহার করে (যা শুরু হয় 1)।
আসুন এখন কিছু প্রতিস্থাপন চেষ্টা করুন। নিম্নলিখিত পাঠ্য বিবেচনা করুন:
Lorem ipsum dolor sit amet consectetuer feugiat fames malesuada pretium egestas.
এখন, এর উপর এই বোবা রেজেক্স ব্যবহার করুন:
\b(\S)(\S)(\S)(\S*)\b
এই রেজেক্স কমপক্ষে 3 টি অক্ষরের সাথে শব্দের সাথে মেলে এবং প্রথম তিনটি অক্ষর আলাদা করতে গ্রুপ ব্যবহার করে। ফলাফল এটি:
Match "Lorem"
Group 1: "L"
Group 2: "o"
Group 3: "r"
Group 4: "em"
Match "ipsum"
Group 1: "i"
Group 2: "p"
Group 3: "s"
Group 4: "um"
...
Match "consectetuer"
Group 1: "c"
Group 2: "o"
Group 3: "n"
Group 4: "sectetuer"
...
সুতরাং, আমরা যদি বিকল্পের স্ট্রিং প্রয়োগ করি:
$1_$3$2_$4
... এটির উপরে, আমরা প্রথম গোষ্ঠীটি ব্যবহার করার চেষ্টা করছি, একটি আন্ডারস্কোর যুক্ত করব, তৃতীয় গোষ্ঠীটি ব্যবহার করব, তারপরে দ্বিতীয় গোষ্ঠীটি, অন্য একটি আন্ডারস্কোর যুক্ত করব এবং তারপরে চতুর্থ গ্রুপটি ব্যবহার করব। ফলস্বরূপ স্ট্রিং নীচের মত হবে।
L_ro_em i_sp_um d_lo_or s_ti_ a_em_t c_no_sectetuer f_ue_giat f_ma_es m_la_esuada p_er_tium e_eg_stas.
আপনি বিকল্পগুলির জন্য নামযুক্ত গোষ্ঠীগুলিও ব্যবহার করে ব্যবহার করতে পারেন ${name}
।
রেজেক্সগুলি নিয়ে ঘুরে দেখার জন্য, আমি http://regex101.com/ কে প্রস্তাব দিই , যা রেজেক্স কীভাবে কাজ করে সে সম্পর্কে বিস্তারিত পরিমাণ সরবরাহ করে; এটি থেকে বেছে নেওয়া কয়েকটি রিজেক্স ইঞ্জিনও সরবরাহ করে।
আপনি একটি অভিব্যক্তি সংগঠিত এবং পার্স করতে ক্যাপচারিং গ্রুপগুলি ব্যবহার করতে পারেন। একটি নন-ক্যাপচারিং গ্রুপের প্রথম সুবিধা রয়েছে তবে দ্বিতীয়টির ওভারহেড নেই। আপনি এখনও বলতে পারেন যে নন-ক্যাপচারিং গ্রুপটি isচ্ছিক, উদাহরণস্বরূপ।
বলুন আপনি সংখ্যার পাঠ্যটি মেলাতে চান তবে কয়েকটি সংখ্যা 1 ম, দ্বিতীয়, তৃতীয়, 4 র্থ হিসাবে লেখা যেতে পারে ... আপনি যদি সংখ্যার অংশটি ক্যাপচার করতে চান তবে (alচ্ছিক) প্রত্যয়টি নয় তবে আপনি একটি নন-ক্যাপচারিং গ্রুপ ব্যবহার করতে পারেন ।
([0-9]+)(?:st|nd|rd|th)?
এটি 1, 2, 3 ফর্মের সাথে বা 1 ম, দ্বিতীয়, তৃতীয়, ফর্মের সাথে সংখ্যার সাথে মিলবে ... তবে এটি কেবল সংখ্যার অংশটি ধারণ করবে।
?:
আপনি যখন একটি এক্সপ্রেশন গোষ্ঠী করতে চান তখন ব্যবহৃত হয়, তবে আপনি স্ট্রিংয়ের ম্যাচ / ক্যাপচার অংশ হিসাবে এটি সংরক্ষণ করতে চান না।
একটি আইপি ঠিকানার সাথে মিলের উদাহরণ হতে পারে:
/(?:\d{1,3}\.){3}\d{1,3}/
মনে রাখবেন যে আমি প্রথম 3 অক্টেট সংরক্ষণের বিষয়ে চিন্তা করি না, তবে (?:...)
দলবদ্ধকরণ আমাকে একটি ম্যাচ ক্যাপচার এবং সঞ্চয় করার ওভারহেড ব্যয় না করে রেইগেক্সকে ছোট করার অনুমতি দেয়।
এটি গ্রুপটিকে নন-ক্যাপচারিং করে তোলে, যার অর্থ that গোষ্ঠীর সাথে মিলে থাকা স্ট্রিংগুলি ক্যাপচারের তালিকায় অন্তর্ভুক্ত করা হবে না। পার্থক্যটি বর্ণনা করার জন্য রুবিতে একটি উদাহরণ:
"abc".match(/(.)(.)./).captures #=> ["a","b"]
"abc".match(/(?:.)(.)./).captures #=> ["b"]
(?:)
কোনও ক্যাপচার তৈরি করে না, এর কোনও কার্যকর উদাহরণ প্রদর্শন করে না (?:)
। (?:)
আপনি যখন একটি উপ-এক্সপ্রেশনকে গোষ্ঠী করতে চান তখন দরকারী (যখন আপনি অ-পারমাণবিক উপ-এক্সপ্রেশনটিতে কোয়ানটিফায়ার প্রয়োগ করতে চান বা আপনি যদি একটি এর ব্যাপ্তি সীমাবদ্ধ করতে চান |
) তবে আপনি কোনও কিছুই ক্যাপচার করতে চান না।
Mতিহাসিক প্রচার:
বন্ধনী ব্যবহারের মাধ্যমে ক্যাপচার না করা গ্রুপগুলির অস্তিত্বের ব্যাখ্যা দেওয়া যেতে পারে।
অভিব্যক্তিগুলি বিবেচনা করুন (a|b)c
এবং a|bc
উপরের দিকে মনোনিবেশের অগ্রাধিকারের কারণে |
, এই অভিব্যক্তি দুটি পৃথক ভাষার প্রতিনিধিত্ব করে ( {ac, bc}
এবং {a, bc}
যথাক্রমে)।
যাইহোক, প্রথম বন্ধনীটি ম্যাচিং গ্রুপ হিসাবে ব্যবহৃত হয় (অন্যান্য উত্তরগুলির দ্বারা ব্যাখ্যা করা হয়েছে ...)।
আপনি যখন প্রথম বন্ধনী রাখতে চান তবে উপ-এক্সপ্রেশনটি ক্যাপচার না করে আপনি নন-ক্যাপচারিং গ্রুপগুলি ব্যবহার করেন। উদাহরণে,(?:a|b)c
আমি এটি একটি উদাহরণ দিয়ে চেষ্টা করুন:
রেজেক্স কোড: (?:animal)(?:=)(\w+)(,)\1\2
অনুসন্ধান স্ট্রিং:
লাইন 1 - animal=cat,dog,cat,tiger,dog
লাইন 2 - animal=cat,cat,dog,dog,tiger
লাইন 3 - animal=dog,dog,cat,cat,tiger
(?:animal)
-> নন-ক্যাপচারড গ্রুপ 1
(?:=)
-> নন-ক্যাপচারড গ্রুপ 2
(\w+)
-> বন্দী গ্রুপ 1
(,)
-> ক্যাপচার গ্রুপ 2
\1
-> বন্দী গোষ্ঠী 1 এর ফলাফল অর্থাৎ লাইন 1 এ বিড়াল, লাইন 2 এ বিড়াল, 3 লাইনে কুকুর।
\2
-> বন্দী গোষ্ঠী 2 এর ফলাফল অর্থাৎ কমা (,)
সুতরাং এই কোডটি দিয়ে \1
এবং \2
আমরা কোডের পরে এবং পরে ক্যাপ্টেড গ্রুপ 1 এবং 2 এর ফলাফল পুনরুদ্ধার বা পুনরাবৃত্তি করি।
কোডের আদেশ অনুসারে (?:animal)
গ্রুপ 1 (?:=)
হওয়া উচিত এবং গ্রুপ 2 হওয়া উচিত এবং চালিয়ে যাওয়া উচিত ..
তবে ?:
আমরা ম্যাচ-গ্রুপকে নন ক্যাপচারড করে দিয়েছি (যা ম্যাচ করা গ্রুপে গণনা করা হয় না, সুতরাং গ্রুপিং নম্বরটি প্রথম ধরা পড়া গ্রুপ থেকে শুরু হয় এবং নন-বন্দী নয়), যাতে ম্যাচ-গ্রুপের ফলাফলের পুনরাবৃত্তি ঘটে (?:animal)
কোড পরে বলা যাবে না।
আশা করি এটি নন ক্যাপচারিং গ্রুপের ব্যবহারটি ব্যাখ্যা করবে।
যে দলগুলি আপনাকে ক্যাপচার করে তারা পরে ম্যাচটি করতে রেজেজেলে ব্যবহার করতে পারে অথবা আপনি এগুলি রেগেক্সের প্রতিস্থাপন অংশে ব্যবহার করতে পারেন। একটি নন-ক্যাপচারিং গ্রুপ তৈরি করা কেবলমাত্র এই কারণগুলির জন্য যে কোনও গ্রুপকে ব্যবহার করা থেকে রেহাই দেয়।
নন-ক্যাপচারিং গ্রুপগুলি দুর্দান্ত যদি আপনি অনেকগুলি বিভিন্ন জিনিস ক্যাপচার করার চেষ্টা করছেন এবং এমন কিছু গোষ্ঠী রয়েছে যা আপনি ক্যাপচার করতে চান না।
বেশিরভাগ কারণেই তাদের উপস্থিতি রয়েছে। আপনি গোষ্ঠী সম্পর্কে শিখার সময়, পরমাণু গোষ্ঠীগুলি সম্পর্কে শিখুন , তারা অনেক কিছু করে! দর্শনীয় গোষ্ঠীগুলিও রয়েছে তবে সেগুলি কিছুটা জটিল এবং এত বেশি ব্যবহৃত হয় না।
রেজেেক্সে পরে ব্যবহারের উদাহরণ (ব্যাক রেফারেন্স):
<([A-Z][A-Z0-9]*)\b[^>]*>.*?</\1>
[একটি এক্সএমএল ট্যাগ সন্ধান করে (এনএস সমর্থন ব্যতীত)]
([A-Z][A-Z0-9]*)
একটি ক্যাপচারিং গ্রুপ (এই ক্ষেত্রে এটি ট্যাগের নাম)
পরবর্তী সময়ে রেজেক্সে এর \1
অর্থ এটি কেবল একই গ্রুপের সাথে মেলে যা প্রথম গ্রুপে ছিল ( ([A-Z][A-Z0-9]*)
গ্রুপ) (এই ক্ষেত্রে এটি শেষ ট্যাগটির সাথে মিলে যাচ্ছে)।
ভাল আমি একটি জাভাস্ক্রিপ্ট বিকাশকারী এবং জাভাস্ক্রিপ্ট সম্পর্কিত এর তাত্পর্য ব্যাখ্যা করার চেষ্টা করব।
আপনি cat is animal
যখন বিড়াল এবং প্রাণীর সাথে মিল রাখতে চান এবং যেখানে উভয়ের is
মধ্যে একটি হওয়া উচিত তখন আপনি এমন কোনও দৃশ্যের কথা বিবেচনা করুন।
// this will ignore "is" as that's is what we want
"cat is animal".match(/(cat)(?: is )(animal)/) ;
result ["cat is animal", "cat", "animal"]
// using lookahead pattern it will match only "cat" we can
// use lookahead but the problem is we can not give anything
// at the back of lookahead pattern
"cat is animal".match(/cat(?= is animal)/) ;
result ["cat"]
//so I gave another grouping parenthesis for animal
// in lookahead pattern to match animal as well
"cat is animal".match(/(cat)(?= is (animal))/) ;
result ["cat", "cat", "animal"]
// we got extra cat in above example so removing another grouping
"cat is animal".match(/cat(?= is (animal))/) ;
result ["cat", "animal"]
জটিল নিয়মিত প্রকাশে আপনি এমন পরিস্থিতি তৈরি করতে পারেন যেখানে আপনি প্রচুর সংখ্যক গোষ্ঠী ব্যবহার করতে চান যেখানে কয়েকটি পুনরাবৃত্তি মিলে যাওয়ার জন্য রয়েছে এবং এর মধ্যে কয়েকটি আবার উল্লেখ করার জন্য রয়েছে। ডিফল্টরূপে প্রতিটি গ্রুপের সাথে মেলে এমন পাঠ্য ব্যাকরেফারেন্স অ্যারেতে লোড হয়। যেখানে আমাদের প্রচুর গোষ্ঠী রয়েছে এবং কেবলমাত্র তাদের কয়েকটি ব্যাকরেফারেন্স অ্যারে থেকে রেফারেন্স করতে সক্ষম হওয়া দরকার আমরা নিয়মিত ভাবটি জানাতে এই ডিফল্ট আচরণটি ওভাররাইড করতে পারি যে নির্দিষ্ট গোষ্ঠীগুলি কেবল পুনরাবৃত্তি পরিচালনার জন্য রয়েছে এবং তাদের ক্যাপচার এবং সংরক্ষণ করার দরকার নেই do পিছনে রেখেছে অ্যারে।
এটি বলার জন্য আমি উপরের উত্তরের বিষয়ে মন্তব্য করতে পারি না: আমি একটি স্পষ্ট বক্তব্য যুক্ত করতে চাই যা কেবল শীর্ষ উত্তরে বর্ণিত রয়েছে:
নন-ক্যাপচারিং গোষ্ঠী মূল পুরো ম্যাচ থেকে কোনও অক্ষর সরিয়ে(?...)
দেয় না , এটি কেবল প্রোগ্রামারটির জন্য দৃষ্টিভঙ্গিটিকে পুনরায় সংগঠিত করে।
সংজ্ঞায়িত বহিরাগত অক্ষর ছাড়াই রেজেক্সের একটি নির্দিষ্ট অংশ অ্যাক্সেস করতে আপনার সর্বদা ব্যবহার করা প্রয়োজন .group(<index>)
tl; ড নন-ক্যাপচারিং গ্রুপগুলি, যেমন নামটি সূচিত করে রেইগেক্সের অংশগুলি যা আপনি ম্যাচে অন্তর্ভুক্ত থাকতে চান না এবং ?:
একটি গ্রুপকে নন-ক্যাপচারিং হিসাবে সংজ্ঞায়িত করার উপায়।
ধরা যাক আপনার একটি ইমেল ঠিকানা আছে example@example.com
। নীচের রেজেক্স দুটি গ্রুপ তৈরি করবে , আইডি অংশ এবং @ উদাহরণ.com অংশ। (\p{Alpha}*[a-z])(@example.com)
। সরলতার জন্য, আমরা @
অক্ষর সহ পুরো ডোমেন নামটি বের করছি ।
এখন বলা যাক, আপনার কেবল ঠিকানাটির আইডি অংশ প্রয়োজন। আপনি যা করতে চান তা হ'ল ম্যাচের ফলাফলের প্রথম গ্রুপটি ধরে নেওয়া, চারদিকে ()
রেজেক্স ঘেরাও করা এবং এটি করার উপায় হ'ল নন-ক্যাপচারিং গ্রুপ সিনট্যাক্স ব্যবহার করা, অর্থাৎ ?:
। সুতরাং রেজেক্স (\p{Alpha}*[a-z])(?:@example.com)
ইমেলের কেবল আইডি অংশটি ফিরিয়ে দেবে।
একটি আকর্ষণীয় বিষয় যা আমি সামনে এলাম তা হ'ল আপনি একটি নন-ক্যাপচারিং গ্রুপের ভিতরে ক্যাপচারিং গ্রুপ রাখতে পারেন। ওয়েব ইউআরএলগুলির সাথে মিলে যাওয়ার জন্য নীচে রেজেক্সগুলি দেখুন:
var parse_url_regex = /^(?:([A-Za-z]+):)(\/{0,3})([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/;
ইনপুট ইউআরএল স্ট্রিং:
var url = "http://www.ora.com:80/goodparts?q#fragment";
আমার রেজেক্সের প্রথম গ্রুপটি (?:([A-Za-z]+):)
একটি নন-ক্যাপচারিং গ্রুপ যা প্রোটোকল স্কিম এবং কোলন :
চরিত্রের সাথে মেলে যেমন http:
আমি যখন কোডের নীচে চলছিলাম http
তখন আমি দেখছিলাম যে ফিরে আসা অ্যারের 1 ম সূচকটি স্ট্রিংটি যুক্ত ছিল যখন আমি ভাবছিলাম http
এবং কোলন :
দু'জনই একটি নন-ক্যাপচারিং গ্রুপের মধ্যে থাকায় তাদের প্রতিবেদন করা হবে না।
console.debug(parse_url_regex.exec(url));
আমি ভেবেছিলাম প্রথম গ্রুপটি (?:([A-Za-z]+):)
যদি নন-ক্যাপচারিং গ্রুপ হয় তবে কেন এটি http
আউটপুট অ্যারেতে স্ট্রিংটি ফিরে আসবে ।
সুতরাং আপনি যদি খেয়াল করেন যে ([A-Za-z]+)
নন-ক্যাপচারিং গোষ্ঠীর ভিতরে নেস্টেড গ্রুপ রয়েছে group সেই নেস্টেড গোষ্ঠীটি ([A-Za-z]+)
একটি ক্যাপচারিং গোষ্ঠীর মধ্যে একটি ক্যাপচারিং গ্রুপ ( ?:
শুরুতে নেই) নিজেই (?:([A-Za-z]+):)
। এ কারণেই পাঠ্যটি http
এখনও ক্যাপচার হয়ে যায় তবে কোলন :
চরিত্রটি যা নন-ক্যাপচারিং গ্রুপের ভিতরে থাকে তবে ক্যাপচারিং গ্রুপের বাইরে থাকে আউটপুট অ্যারেতে রিপোর্ট হয় না।
আপনার গুগল ক্রোম ডেভটুলগুলি এবং তারপরে কনসোল ট্যাবটি খুলুন: এবং এটি টাইপ করুন:
"Peace".match(/(\w)(\w)(\w)/)
এটি চালান এবং আপনি দেখতে পাবেন:
["Pea", "P", "e", "a", index: 0, input: "Peace", groups: undefined]
JavaScript
RegExp ইঞ্জিন ক্যাপচার তিনটি গ্রুপ, ইনডেক্স 1,2,3 সঙ্গে আইটেম। ফলাফলটি দেখতে এখন ক্যাপচার করার চিহ্নটি ব্যবহার করুন।
"Peace".match(/(?:\w)(\w)(\w)/)
ফলাফল হলো:
["Pea", "e", "a", index: 0, input: "Peace", groups: undefined]
এটি নন ক্যাপচারিং গ্রুপ কী তা স্পষ্ট।
আমি মনে করি আমি আপনাকে উত্তর দিতে হবে। ম্যাচটি সফল হয়েছে কিনা তা পরীক্ষা না করে ক্যাপচার ভেরিয়েবল ব্যবহার করবেন না।
ক্যাপচার ভেরিয়েবলগুলি, $1
ইত্যাদি বৈধ নয় যদি ম্যাচটি সফল হয় এবং সেগুলি সাফ না হয়।
#!/usr/bin/perl
use warnings;
use strict;
$_ = "bronto saurus burger";
if (/(?:bronto)? saurus (steak|burger)/)
{
print "Fred wants a $1";
}
else
{
print "Fred dont wants a $1 $2";
}
উপরের উদাহরণে, ধরে রাখার ব্যাপারে bronto এড়াতে $1
, (?:)
ব্যবহার করা হয়।
যদি প্যাটার্নটি মেলানো থাকে তবে তারপরে $1
পরবর্তী গোষ্ঠী বিন্যাস হিসাবে ধরা পড়ে।
সুতরাং, আউটপুট নীচের মত হবে:
Fred wants a burger
আপনি যদি ম্যাচগুলি সংরক্ষণ করা না চান তবে এটি দরকারী।
এটি অত্যন্ত সহজ, আমরা সাধারণ তারিখের উদাহরণ সহ বুঝতে পারি, ধরুন যে তারিখটি 1 লা জানুয়ারী 2019 বা 2 শে মে 2019 বা অন্য কোনও তারিখ হিসাবে উল্লেখ করা হয়েছে এবং আমরা কেবল এটি ডিডি / মিমি / ইয়াই ফর্ম্যাটে রূপান্তর করতে চাই আমাদের মাসের প্রয়োজন হবে না নাম যা এই বিষয়ে জানুয়ারী বা ফেব্রুয়ারি, তাই সংখ্যার অংশটি ক্যাপচার করার জন্য, তবে (alচ্ছিক) প্রত্যয়টি নয় যা আপনি একটি নন-ক্যাপচারিং গ্রুপ ব্যবহার করতে পারেন।
তাই নিয়মিত প্রকাশ হবে,
([0-9]+)(?:January|February)?
এটা ঐটার মতই সহজ.