আপনি কীভাবে কেবল বৈধ রোমান সংখ্যার সাথে নিয়মিত প্রকাশের সাথে মেলে?


165

আমার অন্যান্য সমস্যার কথা চিন্তা করে , আমি সিদ্ধান্ত নিয়েছি যে আমি রোমান সংখ্যাগুলির সাথে মেলে এমন একটি নিয়মিত প্রকাশও তৈরি করতে পারি না (এগুলি উত্পন্ন করবে এমন একটি প্রসঙ্গমুক্ত ব্যাকরণ ছেড়ে দাও)

সমস্যাটি কেবল বৈধ রোমান সংখ্যার সাথে মিলে। উদাহরণস্বরূপ, 990 "এক্সএম" নয়, এটি "সিএমএক্সসি"

এর জন্য রেজেেক্স তৈরির ক্ষেত্রে আমার সমস্যাটি হ'ল নির্দিষ্ট চরিত্রগুলিকে অনুমতি দেওয়া বা না করার জন্য, আমাকে ফিরে তাকাতে হবে। উদাহরণস্বরূপ হাজার হাজার এবং শত গ্রহণ করা যাক।

আমি এম {0,2} C? এম (900, 1000, 1900, 2000, 2900 এবং 3000 এর জন্য অনুমতি দিতে) অনুমতি দিতে পারি। তবে, ম্যাচটি যদি মুখ্যমন্ত্রী হয়, আমি নিম্নলিখিত অক্ষরগুলিকে সি বা ডি হওয়ার অনুমতি দিতে পারি না (কারণ আমি ইতিমধ্যে 900 এ এসেছি)।

আমি কীভাবে এটি একটি রেজেক্সে প্রকাশ করতে পারি?
যদি এটি কেবল কোনও রেজেক্সে প্রকাশযোগ্য না হয়, তবে এটি কি প্রসঙ্গমুক্ত ব্যাকরণে প্রকাশযোগ্য?

উত্তর:


328

আপনি এটির জন্য নিম্নোক্ত রেজেক্স ব্যবহার করতে পারেন:

^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$

কিন্তু ভেঙে, M{0,4}হাজার হাজার অধ্যায় নির্দিষ্ট করে এবং মূলত মধ্যে এটি বিরত রাখে 0এবং 4000। এটি তুলনামূলকভাবে সহজ:

   0: <empty>  matched by M{0}
1000: M        matched by M{1}
2000: MM       matched by M{2}
3000: MMM      matched by M{3}
4000: MMMM     matched by M{4}

আপনি যদি অবশ্যই বড় সংখ্যার অনুমতি দিতে চান তবে আপনি অবশ্যই কয়েক হাজার (শূন্য সহ) যে কোনও সংখ্যাকে M*অনুমতি দেওয়ার মতো কিছু ব্যবহার করতে পারেন ।

এরপরে (CM|CD|D?C{0,3})সামান্য জটিল, এটি কয়েকশো বিভাগের জন্য এবং সমস্ত সম্ভাবনাগুলি কভার করে:

  0: <empty>  matched by D?C{0} (with D not there)
100: C        matched by D?C{1} (with D not there)
200: CC       matched by D?C{2} (with D not there)
300: CCC      matched by D?C{3} (with D not there)
400: CD       matched by CD
500: D        matched by D?C{0} (with D there)
600: DC       matched by D?C{1} (with D there)
700: DCC      matched by D?C{2} (with D there)
800: DCCC     matched by D?C{3} (with D there)
900: CM       matched by CM

তৃতীয়ত, (XC|XL|L?X{0,3}) পূর্ববর্তী বিভাগের মতো একই নিয়ম অনুসরণ করে তবে দশকের জায়গার জন্য:

 0: <empty>  matched by L?X{0} (with L not there)
10: X        matched by L?X{1} (with L not there)
20: XX       matched by L?X{2} (with L not there)
30: XXX      matched by L?X{3} (with L not there)
40: XL       matched by XL
50: L        matched by L?X{0} (with L there)
60: LX       matched by L?X{1} (with L there)
70: LXX      matched by L?X{2} (with L there)
80: LXXX     matched by L?X{3} (with L there)
90: XC       matched by XC

এবং, অবশেষে, (IX|IV|V?I{0,3})ইউনিট অধ্যায়, হ্যান্ডলিং হয় 0মাধ্যমে9 পূর্ববর্তী দুটি বিভাগের সাথে এবং এটিও একইরকম (রোমান সংখ্যাগুলি, তাদের অদ্ভুততা সত্ত্বেও, কিছুগুলি যৌক্তিক নিয়মগুলি অনুসরণ করুন একবার যখন আপনি এটি বুঝতে পারেন):

0: <empty>  matched by V?I{0} (with V not there)
1: I        matched by V?I{1} (with V not there)
2: II       matched by V?I{2} (with V not there)
3: III      matched by V?I{3} (with V not there)
4: IV       matched by IV
5: V        matched by V?I{0} (with V there)
6: VI       matched by V?I{1} (with V there)
7: VII      matched by V?I{2} (with V there)
8: VIII     matched by V?I{3} (with V there)
9: IX       matched by IX

কেবল মনে রাখবেন যে সেই রেজেক্সটি খালি স্ট্রিংয়ের সাথেও মিলবে। আপনি যদি এটি না চান (এবং আপনার রেজেক্স ইঞ্জিনটি যথেষ্ট আধুনিক), আপনি ইতিবাচক চেহারা-পিছন এবং সামনের দিকে ব্যবহার করতে পারেন:

(?<=^)M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})(?=$)

(অন্য বিকল্পটি দৈর্ঘ্যের আগে শূন্য নয় কিনা তা পরীক্ষা করে দেখার জন্য)।


12
এটি এম {0,3 be হওয়া উচিত নয়?
লেবু

3
খালি স্ট্রিং মেলাতে কোনও সমাধান?
ফ্যাসুন্দো ক্যাসো

11
@ আশিষ: রোমানরা যখন গণনা করার মতো শক্তি MMMMছিল , তখন সঠিক পথ ছিল। মূল সাম্রাজ্যটি টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো পরে।
paxdiablo

2
@ প্যাক্সিডিয়াবল এমো এমএমএমসিএম কিভাবে ব্যর্থ হয়েছিল তা আমি পেয়েছি। স্ট্রিং রেজেক্স = "^ এম {0,3} (সিএম | সিডি | ডি? সি {0,3}) (এক্সসি | এক্সএল | এল? এক্স {0,3}) (আইএক্স | চতুর্থ | ভি? আই {0, 3}) $ "; যদি (ইনপুট.ম্যাচগুলি (রেজেক্স)) -> এটি জাভাতে এমএমএমসিএম / এমএমএমএমের জন্য মিথ্যা হিসাবে বিভক্ত হয়।
amIT

2
/^M{0,3}(?:C[MD]|D?C{0,3})(?:X[CL]|L?X{0,3})(?:I[XV]|V?I{0,3})$/i
ক্রিসসভ

23

আসলে, আপনার ভিত্তি ত্রুটিযুক্ত। 990 IS "মধ্যে xm", সেইসাথে "CMXC"।

রোমানরা আপনার তৃতীয় শ্রেণির শিক্ষকের চেয়ে "বিধি" সম্পর্কে খুব কম চিন্তিত ছিল। যতক্ষণ না এটি যুক্ত হয়েছিল, ঠিক আছে। সুতরাং "IIII" 4 "IV" এর মতোই দুর্দান্ত ছিল এবং 998 এর জন্য "আইআইএম" পুরোপুরি শীতল ছিল।

(যদি আপনার সাথে এটির সমস্যা হয় তবে ... মনে রাখবেন ইংরেজী বানানগুলি 1700 সাল পর্যন্ত আনুষ্ঠানিকভাবে করা হয়নি then ততক্ষণ পর্যন্ত যতক্ষণ না পাঠক এটি বুঝতে পারে, এটি যথেষ্ট ভাল ছিল)।


8
অবশ্যই, এটি দুর্দান্ত। তবে আমার "কঠোর তৃতীয় শ্রেণির শিক্ষক" বাক্য গঠনটি আমার মতে অনেক বেশি আকর্ষণীয় রেজেক্স সমস্যা তৈরি করেছে ...
ড্যানিয়েল ম্যাগলিওলা

5
ভাল পয়েন্ট জেমস, একজন কঠোর লেখক হওয়া উচিত তবে একজন ক্ষমাশীল পাঠক।
করিন

@ করিন: ওরফে পোস্টেলের
দৃust়তা

13

এখানে এটি সংরক্ষণ করতে:

(^(?=[MDCLXVI])M*(C[MD]|D?C{0,3})(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$)

সমস্ত রোমান সংখ্যার সাথে মেলে। খালি স্ট্রিংগুলির বিষয়ে চিন্তা করে না (কমপক্ষে একটি রোমান অঙ্কের অক্ষর প্রয়োজন)। পিসিআরই, পার্ল, পাইথন এবং রুবিতে কাজ করা উচিত।

অনলাইন রুবি ডেমো: http://rubular.com/r/KLPR1zq3Hj

অনলাইন রূপান্তর: http://www.onlineconversion.com/roman_numerals_advanced.htm


2
আমি জানি না কেন, তবে মূল উত্তরটি মেমোকিউতে স্বতঃব্যাপি তালিকায় আমার পক্ষে কাজ করে নি। যাইহোক, এই সমাধানটি করে - যদিও স্ট্রিং শুরু / শেষ চিহ্নগুলি বাদ দিয়ে।
orlando2bjr

1
@ orlando2bjr সাহায্য করে খুশি। হ্যাঁ, এক্ষেত্রে আমি চারপাশ ছাড়াই একটি নিজস্ব সংখ্যার সাথে মেলে। আপনি যদি এটি কোনও পাঠ্যে সন্ধান করেন তবে অবশ্যই আপনাকে ^ remove অপসারণ করতে হবে $ চিয়ার্স!
স্মার্টার্ট

12

খালি স্ট্রিং মিলে এড়াতে আপনি প্যাটার্ন চার বার পুনরাবৃত্তি এবং প্রতিটি প্রতিস্থাপন করতে হবে 0একটি সঙ্গে 1জন্য অ্যাকাউন্ট ঘুরে, এবং V, Lএবং D:

(M{1,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})|M{0,4}(CM|C?D|D?C{1,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})|M{0,4}(CM|CD|D?C{0,3})(XC|X?L|L?X{1,3})(IX|IV|V?I{0,3})|M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|I?V|V?I{1,3}))

এই ক্ষেত্রে (কারণ এই প্যাটার্নটি ব্যবহার করে ^এবং $) আপনি প্রথমে খালি লাইনের জন্য পরীক্ষা করা ভাল এবং সেগুলি মেলাতে বিরক্ত করবেন না। আপনি যদি শব্দের সীমানা ব্যবহার করছেন তবে আপনার কোনও সমস্যা নেই কারণ খালি শব্দটির মতো কোনও জিনিস নেই। (কমপক্ষে রেজেক্স একটির সংজ্ঞা দেয় না; দার্শনিকতা শুরু করবেন না, আমি এখানে বাস্তববাদী হচ্ছি!)


আমার নিজস্ব (বাস্তব জগতের) ক্ষেত্রে শব্দের সমাপ্তিতে আমার সংখ্যার সাথে মিলের প্রয়োজন ছিল এবং আমি এর আশেপাশে অন্য কোনও উপায় খুঁজে পাইনি। আমার প্লেইন টেক্সট ডকুমেন্ট থেকে পাদটীকা নম্বরগুলি মুছে ফেলা দরকার ছিল, যেখানে "রেড সি সিএল এবং গ্রেট ব্যারিয়ার রিফ ক্লাইভ " এর মতো পাঠ্য রূপান্তরিত হয়েছিল the Red Seacl and the Great Barrier Reefcli। তবে এখনও আমার মতো বৈধ শব্দের সাথে সমস্যা ছিল Tahitiএবং এতে fantasticস্ক্রাব হয় Tahitএবং fantasti


আমার একই সমস্যা (!): আইটেমের তালিকার অবশিষ্ট / অবশিষ্ট অবধি রোমান সংখ্যার "বাম ট্রিম" করার জন্য (টাইপ I বা i এর এইচটিএমএল ওয়াল)। সুতরাং, যখন অবশিষ্ট, আমি পরিষ্কার (ক ট্রিম ফাংশন মত) আপনার Regex সঙ্গে আইটেম-পাঠ্যের প্রথমে (বামে) এ আরো সহজ প্রয়োজন ... কিন্তু: ITEMS ব্যবহার না Mবা Cবা L, তাই, আপনি এই আছে সরলীকৃত রেগেক্স ধরনের?
পিটার ক্রাউস

... ঠিক আছে, এখানে এটি ঠিক আছে (!),(X{1,3}(IX|IV|V?I{0,3})|X{0,3}(IX|I?V|V?I{1,3}))
পিটার ক্রাউস

1
খালি স্ট্রিংগুলি প্রত্যাখ্যান করার জন্য আপনাকে প্যাটার্নটি পুনরাবৃত্তি করতে হবে না। আপনি
নজরদারী

7

ভাগ্যক্রমে, সংখ্যার পরিসীমা 1..3999 বা এর আশেপাশে সীমাবদ্ধ। অতএব, আপনি রেজেক্স পিস-মিল আপ করতে পারেন।

<opt-thousands-part><opt-hundreds-part><opt-tens-part><opt-units-part>

এই অংশগুলির প্রত্যেকটি রোমান স্বরলিপিটির অস্পষ্টতাগুলি মোকাবেলা করবে। উদাহরণস্বরূপ, পার্ল স্বরলিপি ব্যবহার করে:

<opt-hundreds-part> = m/(CM|DC{0,3}|CD|C{1,3})?/;

পুনরাবৃত্তি এবং একত্রিত।

যোগ করা হয়েছে : <opt-hundreds-part>আরও সংকুচিত করা যেতে পারে:

<opt-hundreds-part> = m/(C[MD]|D?C{0,3})/;

যেহেতু 'ডি? সি {0,3}' ধারাটি কোনও কিছুর সাথে মেলে না, তাই প্রশ্ন চিহ্নের প্রয়োজন নেই। এবং, সম্ভবত, প্রথম বন্ধনীগুলি নন-ক্যাপচারিং টাইপ হওয়া উচিত - পার্লে:

<opt-hundreds-part> = m/(?:C[MD]|D?C{0,3})/;

অবশ্যই, এটি সব ক্ষেত্রে সংবেদনশীলও হওয়া উচিত।

আপনি জেমস কারান দ্বারা উল্লিখিত বিকল্পগুলি (990 বা 999 এর জন্য এক্সএম বা আইএম, এবং 400 এর জন্য সিসিসিসি ইত্যাদির অনুমতি দেওয়ার জন্য) এটি ব্যবহার করতে বাড়াতে পারেন।

<opt-hundreds-part> = m/(?:[IXC][MD]|D?C{0,4})/;

শুরু করে thousands hundreds tens units, এমন একটি এফএসএম তৈরি
jfs

ভাগ্যক্রমে আপনি কী বোঝাতে চেয়েছেন , সংখ্যার পরিসীমাটি 1..3999 বা এর আশেপাশে সীমাবদ্ধ ? কে সীমাবদ্ধ?
সেক্সিবিস্ট

@ সেক্সিবিস্ট: ৫,০০০ এর জন্য কোনও মানক রোমান স্বরলিপি নেই, বড় সংখ্যক একা থাকুক, যাতে নিয়মিত কাজ করে যা কাজ করা বন্ধ করে দেয়।
জোনাথন লেফলার

আপনি কেন এটি বিশ্বাস করেন তা নিশ্চিত নয়, তবে রোমান সংখ্যাগুলি লক্ষ লক্ষ লোককে প্রতিনিধিত্ব করতে পারে। en.wikedia.org/wiki/Roman_numerals#
লার্জ_

@ অ্যামব্রোস চ্যাপেল: যেমনটি আমি বলেছি যে ৫,০০০ এর জন্য কোনও (একক) মানক স্বরলিপি নেই, বড় সংখ্যা ছেড়ে দেওয়া যাক। আপনার লিঙ্ক করা উইকিপিডিয়া নিবন্ধে বর্ণিত অনেকগুলি ডাইভারজেন্ট সিস্টেমের একটি আপনাকে ব্যবহার করতে হবে এবং আপনি ওভারবার, আন্ডারবারস, বা বিপরীত সি ইত্যাদির সাহায্যে সিস্টেমের অর্থোগ্রাফি নিয়ে সমস্যার মুখোমুখি হবেন এবং আপনাকে কারও কাছে ব্যাখ্যা করতে হবে আপনি যে সিস্টেমটি ব্যবহার করছেন এবং এর অর্থ কী; লোকেরা, সাধারণভাবে, এম এর বাইরে রোমান সংখ্যাগুলি চিনতে পারবে না আপনি অন্যথায় ভাবতে বেছে নিতে পারেন; এটি আপনার পূর্বানুক্রমিক, ঠিক যেমনটি আমার পূর্ববর্তী মন্তব্যে দাঁড়িয়ে থাকা আমার পূর্বানুক্রমিক।
জোনাথন লেফলার 4

7
import re
pattern = '^M{0,3}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$'
if re.search(pattern, 'XCCMCI'):
    print 'Valid Roman'
else:
    print 'Not valid Roman'

যে সমস্ত লোকেরা যুক্তিটি সত্যই বুঝতে চান, তাদের জন্য দয়া করে ডাইভেন্টোপথিথনের 3 পৃষ্ঠায় ধাপে ধাপে ধাপে ধাপে একবারে দেখুন

মূল সমাধান থেকে একমাত্র পার্থক্য (যা ছিল M{0,4}) কারণ আমি খুঁজে পেয়েছি যে 'এমএমএমএম' কোনও বৈধ রোমান সংখ্যা নয় (পুরানো রোমানরাও সম্ভবত সেই বিশাল সংখ্যার কথা ভাবেনি এবং আমার সাথে একমত হবে না)। আপনি যদি পুরানো রোমানদের সাথে একমত না হন তবে দয়া করে আমাকে ক্ষমা করুন এবং {0,4} সংস্করণটি ব্যবহার করুন।


1
উত্তরের রেজেক্স খালি সংখ্যাগুলিকে অনুমতি দেয়। যদি আপনি এটি না চান; খালি স্ট্রিংগুলি প্রত্যাখ্যান করার জন্য আপনি নজরদারি ব্যবহার করতে পারেন (এটি অক্ষরের ক্ষেত্রেও উপেক্ষা করে)।
jfs

2

আমি এই প্রশ্নের উত্তর দিচ্ছি রোমান সংখ্যার জন্য পাইথনে নিয়মিত এক্সপ্রেশনটি এখানে
কারণ এটি এই প্রশ্নের সঠিক নকল হিসাবে চিহ্নিত হয়েছিল was

এটি নামের ক্ষেত্রেও একই রকম হতে পারে তবে এটি একটি নির্দিষ্ট রেইজেক্স প্রশ্ন / সমস্যা
যা এই প্রশ্নের উত্তর দিয়ে দেখা যায়।

যে আইটেমগুলির সন্ধান করা হচ্ছে সেগুলি একক বিকল্পের সাথে একত্রিত করা যেতে পারে এবং তারপরে
একটি ক্যাপচার গোষ্ঠীর অভ্যন্তরে আবদ্ধ করা যায় যা ফান্ডাল ()
ফাংশন সহ একটি তালিকায় রাখা হবে ।
এটি এভাবে করা হয়:

>>> import re
>>> target = (
... r"this should pass v" + "\n"
... r"this is a test iii" + "\n"
... )
>>>
>>> re.findall( r"(?m)\s(i{1,3}v*|v)$", target )
['v', 'iii']

কেবলমাত্র সংখ্যাগুলিকে ফ্যাক্ট করতে এবং ক্যাপচার করার জন্য রেজেক্স পরিবর্তনগুলি হ'ল:

 (?m)
 \s 
 (                     # (1 start)
      i{1,3} 
      v* 
   |  v
 )                     # (1 end)
 $

1

জেরেমি এবং প্যাক্স যেমন উপরে উল্লেখ করেছেন ... '^ এম {0,4} (সিএম | সিডি | ডি? সি {0,3}) (এক্সসি | এক্সএল | এল? এক্স {0,3}) (আইএক্স | চতুর্থ | ভি? আমি {0,3}) after 'এর পরে আপনার সমাধান হওয়া উচিত ...

(আইএমএইচও) সংযুক্ত হওয়া উচিত হওয়া নির্দিষ্ট ইউআরএলটি হ'ল http://thehazeltree.org/diveintopython/7.html

উদাহরণ 7..৮ হ'ল সংক্ষিপ্ত রূপ is n, m using


1

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

(?=\b[MCDXLVI]{1,6}\b)M{0,4}(?:CM|CD|D?C{0,3})(?:XC|XL|L?X{0,3})(?:IX|IV|V?I{0,3})

আমার চূড়ান্ত পাইথন কোডটি এরকম ছিল:

import re
text = "RULES OF LIFE: I. STAY CURIOUS; II. NEVER STOP LEARNING"
text = re.sub(r'(?=\b[MCDXLVI]{1,6}\b)M{0,4}(?:CM|CD|D?C{0,3})(?:XC|XL|L?X{0,3})(?:IX|IV|V?I{0,3})', 'ROMAN', text)
print(text)

আউটপুট:

RULES OF LIFE: ROMAN. STAY CURIOUS; ROMAN. NEVER STOP LEARNING

0

স্টিভেন লেভিথন তার পোস্টে এই রেজেক্স ব্যবহার করেছেন যা মানকে "ডায়ারম্যানাইজেশন" করার আগে রোমান সংখ্যার বৈধতা দেয়:

/^M*(?:D?C{0,3}|C[MD])(?:L?X{0,3}|X[CL])(?:V?I{0,3}|I[XV])$/

0

আমি একাধিক উত্তর দেখেছি যা খালি স্ট্রিংগুলি কভার করে না বা এটি সমাধান করার জন্য লুক হেড ব্যবহার করে। এবং আমি একটি নতুন উত্তর যুক্ত করতে চাই যা খালি স্ট্রিংগুলি কভার করে এবং লুক হেড ব্যবহার করে না। রেজেক্স নিম্নলিখিতটি হ'ল:

^(I[VX]|VI{0,3}|I{1,3})|((X[LC]|LX{0,3}|X{1,3})(I[VX]|V?I{0,3}))|((C[DM]|DC{0,3}|C{1,3})(X[LC]|L?X{0,3})(I[VX]|V?I{0,3}))|(M+(C[DM]|D?C{0,3})(X[LC]|L?X{0,3})(I[VX]|V?I{0,3}))$

আমি অসীমের জন্য অনুমতি দিচ্ছি M, M+তবে অবশ্যই কেউ চাইলে M{1,4}কেবল 1 বা 4 এর অনুমতি দিতে পরিবর্তন করতে পারে।

নীচে একটি ভিজ্যুয়ালাইজেশন রয়েছে যা দুটি অনলাইন ডেমো এর আগে এটি কী করছে তা বুঝতে সহায়তা করে:

ডিবাগেক্স ডেমো

রেজেজেক্স 101 ডেমো

নিয়মিত প্রকাশের ভিজ্যুয়ালাইজেশন


0

এটি জাভা এবং পিসিআরই রেজেক্স ইঞ্জিনগুলিতে কাজ করে এবং এখন সর্বশেষতম জাভাস্ক্রিপ্টে কাজ করা উচিত তবে সমস্ত প্রসঙ্গে কাজ করতে পারে না।

(?<![A-Z])(M*(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3}))(?![A-Z])

প্রথম অংশটি হ'ল নৃশংস নেতিবাচক লুকের পিছনে। তবে, যৌক্তিক উদ্দেশ্যে এটি বোঝা সহজ। মূলত, প্রথমটি (?<!)বলছে মাঝের সাথে ([MATCH])যদি চিঠিগুলি আসে তবে মাঝের সাথে মেলে না ([MATCH])এবং শেষটি (?!)বলছে ([MATCH])এরপরের পরে যদি চিঠি আসে তবে মাঝের সাথে মেলে না ।

মধ্যম ([MATCH])রোমান সংখ্যা ক্রম মেলানোর জন্য শুধু সবচেয়ে বেশি ব্যবহৃত Regex হয়। তবে এখন, আপনি এটির সাথে মিল রাখতে চান না যদি এর আশেপাশে কোনও চিঠি থাকে।

নিজের জন্য দেখুন. https://regexr.com/4vce5


-1

জেরেমি এবং প্যাক্সের সমাধানের সমস্যাটি হ'ল এটি "কিছুতেই" মিলছে না।

নিম্নলিখিত রেজেক্স কমপক্ষে একটি রোমান সংখ্যার প্রত্যাশা করে:

^(M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})|[IDCXMLV])$

6
যেটি কাজ করবে না (যদি না আপনি খুব অদ্ভুত রেজেক্স বাস্তবায়ন ব্যবহার করেন) - কানের বাম অংশটি |একটি খালি স্ট্রিং এবং সমস্ত বৈধ রোমান সংখ্যার সাথে মেলে, তাই ডান দিকটি সম্পূর্ণ অপ্রয়োজনীয়। এবং হ্যাঁ, এটি এখনও একটি খালি স্ট্রিংয়ের সাথে মেলে।
ময়লা আইসিই

"জেরেমি এবং প্যাক্স থেকে সমাধানের সমস্যাটি হ'ল" ... এই উত্তরটিতে যে সমস্যাটি এসেছে ঠিক ঠিক একই। আপনি যদি কোনও অনুমান সমস্যার সমাধানের প্রস্তাব দিতে চলেছেন তবে আপনার সম্ভবত এটি পরীক্ষা করা উচিত। :-)
paxdiablo

আমি
এটির

-2

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

function ConvertFrom-RomanNumeral
{
  <#
    .SYNOPSIS
        Converts a Roman numeral to a number.
    .DESCRIPTION
        Converts a Roman numeral - in the range of I..MMMCMXCIX - to a number.
    .EXAMPLE
        ConvertFrom-RomanNumeral -Numeral MMXIV
    .EXAMPLE
        "MMXIV" | ConvertFrom-RomanNumeral
  #>
    [CmdletBinding()]
    [OutputType([int])]
    Param
    (
        [Parameter(Mandatory=$true,
                   HelpMessage="Enter a roman numeral in the range I..MMMCMXCIX",
                   ValueFromPipeline=$true,
                   Position=0)]
        [ValidatePattern("^M{0,3}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$")]
        [string]
        $Numeral
    )

    Begin
    {
        $RomanToDecimal = [ordered]@{
            M  = 1000
            CM =  900
            D  =  500
            CD =  400
            C  =  100
            XC =   90
            L  =   50
            X  =   10
            IX =    9
            V  =    5
            IV =    4
            I  =    1
        }
    }
    Process
    {
        $roman = $Numeral + " "
        $value = 0

        do
        {
            foreach ($key in $RomanToDecimal.Keys)
            {
                if ($key.Length -eq 1)
                {
                    if ($key -match $roman.Substring(0,1))
                    {
                        $value += $RomanToDecimal.$key
                        $roman  = $roman.Substring(1)
                        break
                    }
                }
                else
                {
                    if ($key -match $roman.Substring(0,2))
                    {
                        $value += $RomanToDecimal.$key
                        $roman  = $roman.Substring(2)
                        break
                    }
                }
            }
        }
        until ($roman -eq " ")

        $value
    }
    End
    {
    }
}

function ConvertTo-RomanNumeral
{
  <#
    .SYNOPSIS
        Converts a number to a Roman numeral.
    .DESCRIPTION
        Converts a number - in the range of 1 to 3,999 - to a Roman numeral.
    .EXAMPLE
        ConvertTo-RomanNumeral -Number (Get-Date).Year
    .EXAMPLE
        (Get-Date).Year | ConvertTo-RomanNumeral
  #>
    [CmdletBinding()]
    [OutputType([string])]
    Param
    (
        [Parameter(Mandatory=$true,
                   HelpMessage="Enter an integer in the range 1 to 3,999",
                   ValueFromPipeline=$true,
                   Position=0)]
        [ValidateRange(1,3999)]
        [int]
        $Number
    )

    Begin
    {
        $DecimalToRoman = @{
            Ones      = "","I","II","III","IV","V","VI","VII","VIII","IX";
            Tens      = "","X","XX","XXX","XL","L","LX","LXX","LXXX","XC";
            Hundreds  = "","C","CC","CCC","CD","D","DC","DCC","DCCC","CM";
            Thousands = "","M","MM","MMM"
        }

        $column = @{Thousands = 0; Hundreds = 1; Tens = 2; Ones = 3}
    }
    Process
    {
        [int[]]$digits = $Number.ToString().PadLeft(4,"0").ToCharArray() |
                            ForEach-Object { [Char]::GetNumericValue($_) }

        $RomanNumeral  = ""
        $RomanNumeral += $DecimalToRoman.Thousands[$digits[$column.Thousands]]
        $RomanNumeral += $DecimalToRoman.Hundreds[$digits[$column.Hundreds]]
        $RomanNumeral += $DecimalToRoman.Tens[$digits[$column.Tens]]
        $RomanNumeral += $DecimalToRoman.Ones[$digits[$column.Ones]]

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