টি এল; ডিআর
ব্যবহার করুন [.]পরিবর্তে \.এবং [0-9]পরিবর্তে \dকিছু কিছু ভাষায় (জাভা মত) এ বিষয় পলায়নের এড়ানো।
মূলত এটি স্বীকৃতি দেওয়ার জন্য নামহীনকে ধন্যবাদ ।
একটি ভাসমান পয়েন্ট সংখ্যার সাথে মেলে তুলনামূলকভাবে একটি সহজ প্যাটার্ন
[+-]?([0-9]*[.])?[0-9]+
এটি মিলবে:
একটি কাজের উদাহরণ দেখুন
যদি আপনিও ম্যাচ করতে চান 123.(দশমিক অংশ ছাড়াই একটি পিরিয়ড), তবে আপনার কিছুটা দীর্ঘ এক্সপ্রেশন প্রয়োজন:
[+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)
এই প্যাটার্নটির পূর্ণাঙ্গ ব্যাখ্যার জন্য পকেলারের উত্তর দেখুন
আপনি যদি দশমিক নম্বরের সংখ্যা যেমন হেক্স এবং অষ্টাল অন্তর্ভুক্ত করতে চান তবে আমার উত্তরটি দেখুন কীভাবে আমি একটি সংখ্যার স্ট্রিং হয় তা সনাক্ত করব? ।
যদি আপনি বৈধতা দিতে চান যে কোনও ইনপুটটি একটি সংখ্যা (ইনপুটটির মধ্যে একটি সংখ্যা খুঁজে না পাওয়ার চেয়ে), তবে আপনার সাথে প্যাটার্নটি ঘিরে রাখা উচিত ^এবং এর $মতো:
^[+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)$
অনিয়মিত নিয়মিত অভিব্যক্তি
"নিয়মিত প্রকাশ", বেশিরভাগ আধুনিক ভাষায় প্রয়োগ করা হয়েছে, এপিআই, ফ্রেমওয়ার্ক, গ্রন্থাগার, ইত্যাদি, আনুষ্ঠানিক ভাষা তত্ত্বের বিকাশের ধারণার উপর ভিত্তি করে । তবে, সফ্টওয়্যার প্রকৌশলীরা অনেকগুলি এক্সটেনশন যুক্ত করেছেন যা এই প্রয়োগগুলি আনুষ্ঠানিক সংজ্ঞা থেকে অনেক দূরে নিয়ে যায়। সুতরাং, বেশিরভাগ নিয়মিত এক্সপ্রেশন ইঞ্জিনগুলি একে অপরের সাথে সাদৃশ্যপূর্ণ হলেও আসলে কোনও মান নেই। এই কারণে, আপনি কোন ভাষা, এপিআই, ফ্রেমওয়ার্ক বা লাইব্রেরি ব্যবহার করছেন তার উপর অনেক কিছুই নির্ভর করে।
(উল্লেখ্য, সাহায্যের বিভ্রান্তির কমাতে অনেক "ব্যবহার নিয়েছে Regex " বা " regexp " এই বর্ধিত ম্যাচিং ভাষায় বর্ণনা করার জন্য। দেখুন একটি Regex একটি রেগুলার এক্সপ্রেশন হিসাবে একই? RexEgg.com এ আরও তথ্যের জন্য।)
এটি বলেছিল, বেশিরভাগ রেজেক্স ইঞ্জিনগুলি (আসলে, তাদের সমস্তগুলি, যতদূর আমি জানি) গ্রহণ করবে \.। সম্ভবত, পালানোর সমস্যা আছে।
পালাতে সমস্যা
কিছু ভাষায় জাভাস্ক্রিপ্টের মতো রেজেক্সেসের জন্য অন্তর্নির্মিত সমর্থন রয়েছে । যে ভাষাগুলি নেই, তাদের জন্য পলায়ন একটি সমস্যা হতে পারে।
এটি কারণ আপনি মূলত কোনও ভাষার মধ্যে একটি ভাষায় কোডিং করছেন। জাভা, উদাহরণস্বরূপ, \এর স্ট্রিংগুলির মধ্যে একটি অব্যাহতি চরিত্র হিসাবে ব্যবহার করে, তাই যদি আপনি কোনও স্ট্রিংয়ের মধ্যে আক্ষরিক ব্যাকস্ল্যাশ অক্ষর রাখতে চান তবে আপনাকে অবশ্যই এড়াতে হবে:
// creates a single character string: "\"
String x = "\\";
যাইহোক, regexes এছাড়াও ব্যবহার \পলায়নের জন্য চরিত্র, তাই আপনি যদি একটি আক্ষরিক মেলে চান \চরিত্র, আপনি এটি regexe ইঞ্জিন অব্যাহতি আবশ্যক, এবং তারপর জাভা জন্য আবার এটা অব্যাহতি:
// Creates a two-character string: "\\"
// When used as a regex pattern, will match a single character: "\"
String regexPattern = "\\\\";
আপনার ক্ষেত্রে, আপনি যে ভাষায় প্রোগ্রামিং করছেন সে ক্ষেত্রে সম্ভবত আপনি ব্যাকস্ল্যাশ চরিত্রটি এড়িয়ে গেছেন:
// will most likely result in an "Illegal escape character" error
String wrongPattern = "\.";
// will result in the string "\."
String correctPattern = "\\.";
এই সমস্ত পালাতে খুব বিভ্রান্তি পেতে পারে। আপনি যে ভাষাটির সাথে কাজ করছেন তা যদি কাঁচা স্ট্রিং সমর্থন করে তবে আপনার ব্যাকস্ল্যাশগুলির সংখ্যা হ্রাস করার জন্য এটি ব্যবহার করা উচিত, তবে সমস্ত ভাষায় তা হয় না (উল্লেখযোগ্যভাবে: জাভা)। ভাগ্যক্রমে, একটি বিকল্প রয়েছে যা কিছু সময় কার্যকর করবে:
String correctPattern = "[.]";
একটি রেজেক্স ইঞ্জিনের জন্য, \.এবং [.]ঠিক একই জিনিসটি বোঝাতে। মনে রাখবেন যে এটি প্রতিটি ক্ষেত্রে যেমন নিউলাইন ( \\n), ওপেন স্কোয়ার ব্র্যাকেট ( \\[) এবং ব্যাকস্ল্যাশ ( \\\\বা [\\]) এর মতো কাজ করে না ।
ম্যাচিং নম্বর সম্পর্কে একটি নোট
(ইঙ্গিত: এটি আপনার ভাবার চেয়ে শক্ত)
একটি নম্বর মিলে যাওয়া সেই জিনিসগুলির মধ্যে একটি যা আপনি মনে করেন রেইগেক্সের সাথে বেশ সহজ, তবে এটি আসলে বেশ জটিল। আসুন আপনার পন্থাটি একবার টুকরো টুকরো দেখুন:
[-+]?
একটি alচ্ছিক -বা+
[0-9]*
0 বা ততোধিক ক্রমিক সংখ্যা মেলে atch
\.?
একটি .চ্ছিক মিল .
[0-9]*
0 বা ততোধিক ক্রমিক সংখ্যা মেলে atch
প্রথমত, আমরা অঙ্কগুলির জন্য একটি অক্ষর শ্রেণির শর্টহ্যান্ড ব্যবহার করে এই ভাবটি কিছুটা পরিষ্কার করতে পারি (নোট করুন যে এটি উপরে বর্ণিত পলাতক ইস্যুতেও সংবেদনশীল):
[0-9] = \d
আমি \dনীচে ব্যবহার করতে যাচ্ছি , তবে মনে রাখবেন যে এটির মতো একই জিনিস [0-9]। (ভাল, আসলে, কিছু ইঞ্জিনে \dসমস্ত স্ক্রিপ্টের অঙ্কগুলি মিলবে, তাই এটি [0-9]ইচ্ছার চেয়ে বেশি মিলবে , তবে এটি সম্ভবত আপনার ক্ষেত্রে তাত্পর্যপূর্ণ নয়))
এখন, আপনি যদি এটি মনোযোগ দিয়ে দেখুন, আপনি বুঝতে পারবেন যে আপনার প্যাটার্নের প্রতিটি অংশ alচ্ছিক । এই প্যাটার্নটি 0-দৈর্ঘ্যের স্ট্রিংয়ের সাথে মেলে; একটি স্ট্রিং শুধুমাত্র +বা এর সমন্বয়ে গঠিত -; বা, কেবল একটি এর সমন্বয়ে একটি স্ট্রিং .। আপনি সম্ভবত যা ইচ্ছা এটি এটি নয়।
এটি সমাধানের জন্য, খালি-ন্যূনতম প্রয়োজনীয় স্ট্রিং, সম্ভবত একক অঙ্কের সাথে আপনার রেজেক্সকে "অ্যাঙ্করিং" করে শুরু করা সহায়ক:
\d+
এখন আমরা দশমিক অংশ যুক্ত করতে চাই, তবে আপনি যেখানে মনে করেন এটি এটি যায় না:
\d+\.?\d* /* This isn't quite correct. */
এটি এখনও মানগুলির সাথে মিলবে 123.। সবচেয়ে খারাপ বিষয়, এটি সম্পর্কে খারাপের আভা পেয়েছে । পিরিয়ডটি isচ্ছিক, এর অর্থ আপনি পাশের পাশাপাশি দুটি পুনরাবৃত্তি ক্লাস পেয়েছেন ( \d+এবং \d*)। আপনার সিস্টেমে ডস-এর আক্রমণে খোলার জন্য যদি এটি ভুল উপায়ে ব্যবহার করা হয় তবে এটি আসলে বিপজ্জনক হতে পারে।
এটিকে ঠিক করার জন্য, পিরিয়ডটিকে asচ্ছিক হিসাবে বিবেচনা করার পরিবর্তে, আমাদের এটি প্রয়োজন হিসাবে চিকিত্সা করা উচিত (পুনরাবৃত্ত অক্ষর শ্রেণি পৃথক করার জন্য) এবং এর পরিবর্তে পুরো দশমিক অংশটি portionচ্ছিকভাবে করা উচিত:
\d+(\.\d+)? /* Better. But... */
এটি এখন আরও ভাল দেখাচ্ছে। আমাদের প্রথম অঙ্কের দ্বিতীয় ক্রম এবং দ্বিতীয়টির মধ্যে একটি সময়কালের প্রয়োজন, তবে একটি মারাত্মক ত্রুটি রয়েছে: আমরা মিলতে পারছি না .123কারণ একটি শীর্ষস্থানীয় অঙ্ক এখন প্রয়োজন।
এটি ঠিক করা বেশ সহজ। সংখ্যার "দশমিক" অংশটি পরিবর্তনের পরিবর্তে আমাদের এটিকে অক্ষরের ক্রম হিসাবে দেখতে হবে: 1 বা আরও বেশি সংখ্যার যেটি .0 বা আরও সংখ্যার দ্বারা উপস্থাপিত হতে পারে:
(\d*\.)?\d+
এখন আমরা সাইন যোগ করুন:
[+-]?(\d*\.)?\d+
অবশ্যই, জাভাতে এই স্ল্যাশগুলি বেশ বিরক্তিকর, তাই আমরা আমাদের দীর্ঘ-রূপের চরিত্রের ক্লাসগুলিতে প্রতিস্থাপন করতে পারি:
[+-]?([0-9]*[.])?[0-9]+
মিলকরণ বনাম বৈধকরণ
এটি বেশ কয়েকবার মন্তব্যে উঠে এসেছে, তাই আমি বৈধকরণের তুলনায় ম্যাচিংয়ের একটি সংযোজন করছি।
মিলের লক্ষ্য হ'ল ইনপুটটির মধ্যে কিছু সামগ্রী খুঁজে পাওয়া ("একটি খড়ের কাঁটাতে সূঁচ")। বৈধকরণের লক্ষ্যটি ইনপুটটি প্রত্যাশিত বিন্যাসে রয়েছে তা নিশ্চিত করা to
রেজিক্সগুলি, তাদের প্রকৃতি অনুসারে কেবল পাঠ্যের সাথে মেলে । কিছু ইনপুট দেওয়া হয়েছে, তারা হয় কিছু মিলিত পাঠ্য পাবেন বা তারা পাবেন না। যাইহোক, শুরুতে একটি অভিব্যক্তি "snapping" এবং নোঙ্গর ট্যাগ (সঙ্গে ইনপুটের শেষ দ্বারা ^এবং $), আমরা নিশ্চিত করতে পারি যে কোনো মিল যদি না সমগ্র ইনপুট এক্সপ্রেশনের সাথে মেলে, কার্যকরীভাবে থেকে regexes ব্যবহার পাওয়া যায় বৈধকরণ ।
Regex (উপরে বর্ণিত [+-]?([0-9]*[.])?[0-9]+) হবে মেলে লক্ষ্য স্ট্রিং মধ্যে এক বা একাধিক নম্বর। সুতরাং ইনপুট দেওয়া:
apple 1.34 pear 7.98 version 1.2.3.4
Regex ম্যাচ হবে 1.34, 7.98, 1.2, .3এবং .4।
প্রদত্ত ইনপুটটি একটি সংখ্যা এবং একটি সংখ্যা ছাড়া কিছুই নয় তা যাচাই করার জন্য, অ্যাঙ্কর ট্যাগগুলিতে মোড়ক দিয়ে ইনপুটটির শুরু এবং শেষ পর্যন্ত অভিব্যক্তিটি "স্ন্যাপ" করুন:
^[+-]?([0-9]*[.])?[0-9]+$
পুরো ইনপুটটি যদি একটি ভাসমান পয়েন্ট সংখ্যা হয় তবে এটি কেবল একটি মিল খুঁজে পাবে এবং ইনপুটটিতে অতিরিক্ত অক্ষর থাকলে কোনও মিল খুঁজে পাবে না। সুতরাং, ইনপুট দেওয়া হলে 1.2, একটি ম্যাচ সন্ধান করা হবে, তবে apple 1.2 pearকোনও মিল পাওয়া যাবে না।
মনে রাখবেন, কিছু Regex ইঞ্জিন একটি আছে validate, isMatchবা অনুরূপ ফাংশন, যা মূলত কি আমি স্বয়ংক্রিয়ভাবে বর্ণনা করেছি, ফিরে না trueযদি কোনো মিল পাওয়া যায় এবং falseযদি কোনো মিল পাওয়া যায়। এছাড়াও মনে রাখতে যে কিছু ইঞ্জিন সেট পতাকা যার সংজ্ঞা পরিবর্তন করতে আপনাকে অনুমতি দেয় ^এবং $, শুরুতে / বদলে সমগ্র ইনপুট শুরুতে / শেষ একটি লাইনের শেষে মিলে। এটি সাধারণত ডিফল্ট নয়, তবে এই পতাকাগুলির সন্ধানে থাকুন।