আমি প্রাথমিকতার পরীক্ষার বাইরে রেজেক্স অংশটি ব্যাখ্যা করব: নীচের রেজেক্স, String s
যা পুনরাবৃত্তি নিয়ে গঠিত String t
, সন্ধান করেছে t
।
System.out.println(
"MamamiaMamamiaMamamia".replaceAll("^(.*)\\1+$", "$1")
); // prints "Mamamia"
এটি যেভাবে কাজ করে তা হ'ল রেজেক্স ক্যাপচার (.*)
করে \1
এবং তারপরে \1+
এটি অনুসরণ করে কিনা তা দেখে । ব্যবহার করে ^
এবং $
নিশ্চিত করে যে কোনও ম্যাচ অবশ্যই পুরো স্ট্রিংয়ের।
সুতরাং, একটি উপায়ে, আমাদের দেওয়া হয়েছে String s
, যা একটি "একাধিক" String t
এবং রেজেক্স এমনটি খুঁজে পাবে t
(যেহেতু \1
লোভী তাই দীর্ঘতম সম্ভব )।
একবার আপনি বুঝতে পারবেন কেন এই রেজেক্সটি কাজ করে, তারপরে (আপাতত ওপি'র রেজেক্সের প্রথম বিকল্পটিকে উপেক্ষা করে) কীভাবে এটি প্রাথমিকতা পরীক্ষার জন্য ব্যবহৃত হয় তা সহজ।
- এর প্রাথমিকতা পরীক্ষা করতে
n
প্রথমে একটি String
দৈর্ঘ্য তৈরি করুন n
(একই সাথে ভরা char
)
- রেজেক্স
String
কিছু দৈর্ঘ্যের (বলুন k
) কে ক্যাপচার \1
করে এবং বাকীটির সাথে মিলে \1+
যাওয়ার চেষ্টা করেString
- যদি কোনও মিল থাকে তবে
n
এটির যথাযথ একাধিক হয় k
এবং তাই n
এটি প্রাইম নয়।
- যদি কোনও মিল নেই, তবে
k
বিভাজনকারী এমন কোনও উপস্থিতি নেই n
এবং n
তাই এটি প্রধান
.?|(..+?)\1+
মৌলিক সংখ্যাগুলি কীভাবে মেলে?
আসলে, এটা না! এটি মেলে String
যার দৈর্ঘ্য প্রধান নয়!
.?
: String
দৈর্ঘ্যের পরিবর্তনের ম্যাচগুলির প্রথম অংশ 0
বা 1
(সংজ্ঞা অনুসারে প্রধান নয়)
(..+?)\1+
: আবর্তনে দ্বিতীয় অংশ, Regex একটি প্রকরণ উপরে বর্ণিত, ম্যাচ String
দৈর্ঘ্যের n
একটি এর "একটি একাধিক" যে String
দৈর্ঘ্য k >= 2
(অর্থাত n
একটি যৌগিক, না একটি মৌলিক যায়)।
- নোট করুন যে অনিচ্ছুক সংশোধক
?
প্রকৃতপক্ষে নির্ভুলতার জন্য প্রয়োজন নেই, তবে এটি k
প্রথমে আরও ছোট চেষ্টা করে প্রক্রিয়াটি গতিতে সহায়তা করতে পারে
বিবৃতিতে !
boolean
পরিপূরক অপারেটর নোট করুন return
: এটি উপেক্ষা করে matches
। এটি যখন রেজেক্স মিলবে না , n
প্রধান! এটি একটি দ্বৈত-নেতিবাচক যুক্তি, তাই এতে বিভ্রান্ত হওয়ার মতো অবাক হওয়ার কিছু নেই !!
সরলীকরণ
কোডটিকে আরও পঠনযোগ্য করে তোলার জন্য এখানে একটি সরল পুনরায় লেখা রয়েছে:
public static boolean isPrime(int n) {
String lengthN = new String(new char[n]);
boolean isNotPrimeN = lengthN.matches(".?|(..+?)\\1+");
return !isNotPrimeN;
}
উপরেরটি মূলত মূল জাভা কোডের সমান, তবে যুক্তিকে বুঝতে সহজ করার জন্য স্থানীয় ভেরিয়েবলগুলিকে অ্যাসাইনমেন্ট সহ একাধিক বিবৃতি বিভক্ত করা হয়েছে।
নিম্নরূপে সীমাবদ্ধ পুনরাবৃত্তি ব্যবহার করে আমরা রেজেক্স আরও সরল করতে পারি:
boolean isNotPrimeN = lengthN.matches(".{0,1}|(.{2,})\\1+");
আবার একই String
দৈর্ঘ্যে একটি দৈর্ঘ্য দেওয়া হয়েছে ,n
char
.{0,1}
পরীক্ষা করে দেখুন n = 0,1
, প্রধানমন্ত্রী না
(.{2,})\1+
প্রাইম নয়, এর n
সঠিক একাধিক কিনা তা পরীক্ষা করেk >= 2
অনিচ্ছুক পরিবর্তক ব্যতীত ?
উপর \1
(স্বচ্ছতার জন্য বাদ দেওয়া), উপরে Regex মূল অভিন্ন।
আরও মজা regex
নিম্নলিখিত রেজেক্স একই জাতীয় কৌশল ব্যবহার করে; এটি শিক্ষামূলক হওয়া উচিত:
System.out.println(
"OhMyGod=MyMyMyOhGodOhGodOhGod"
.replaceAll("^(.+)(.+)(.+)=(\\1|\\2|\\3)+$", "$1! $2! $3!")
); // prints "Oh! My! God!"
আরো দেখুন
!new String(new char[n]).matches(".?|(..+?)\\1+")
সমান!((new String(new char[n])).matches(".?|(..+?)\\1+"))
।