ভাসমান পয়েন্ট সংখ্যাগুলির জন্য নিয়মিত প্রকাশ


115

ভাসমান পয়েন্ট সংখ্যা মেলে আমার একটি কাজ রয়েছে। আমি এটির জন্য নিম্নলিখিত নিয়মিত প্রকাশটি লিখেছি:

[-+]?[0-9]*\.?[0-9]*

তবে, এটি একটি ত্রুটি প্রদান করে:

Invalid escape sequence (valid ones are  \b  \t  \n  \f  \r  \"  \'  \\ )

আমার জ্ঞান অনুযায়ী, আমাদের .এছাড়াও একটি পালানোর চরিত্রটি ব্যবহার করা উচিত। আমি যেখানে ভুল আমি দয়া করে সংশোধন করুন।


10
এই রেজেক্সটি কোন ভাষায় ব্যবহৃত হয়?
ক্যাফগিকে

3
@ জেডিবি - আপনি কেন একটি নম্বর / ফ্লোট রেজেক্সের জন্য 100 পয়েন্ট দিচ্ছেন? স্ট্যান্ডার্ডটি সর্বদা হয়েছে (?:\d+(?:\.\d*)?|\.\d+)এবং তাই পোস্ট করা হয়েছে বিজ্ঞাপনের উপর ...


1
[-+]?([0-9]*[.])?[0-9]+([eE][-+]?\d+)?আপনি যদি খুব সূচকীয় স্বরলিপিটিও পেতে চান, e, g, 3.023e-23
wcochran

জাভা বা সি ++ এর মতো কিছু ভাষায়, ব্যাকস্ল্যাশ এড়াতে হবে। সুতরাং "\।" রেজেক্সটি পেতে, আপনি "\\" স্ট্রিংটি ব্যবহার করবেন \\ পাইথন কাঁচা স্ট্রিং ব্যবহার করে এটিকে ঘিরে।
হ্যাকারবস

উত্তর:


258

টি এল; ডিআর

ব্যবহার করুন [.]পরিবর্তে \.এবং [0-9]পরিবর্তে \dকিছু কিছু ভাষায় (জাভা মত) এ বিষয় পলায়নের এড়ানো।

মূলত এটি স্বীকৃতি দেওয়ার জন্য নামহীনকে ধন্যবাদ ।

একটি ভাসমান পয়েন্ট সংখ্যার সাথে মেলে তুলনামূলকভাবে একটি সহজ প্যাটার্ন

[+-]?([0-9]*[.])?[0-9]+

এটি মিলবে:

  • 123
  • 123.456
  • .456

একটি কাজের উদাহরণ দেখুন

যদি আপনিও ম্যাচ করতে চান 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যদি কোনো মিল পাওয়া যায়। এছাড়াও মনে রাখতে যে কিছু ইঞ্জিন সেট পতাকা যার সংজ্ঞা পরিবর্তন করতে আপনাকে অনুমতি দেয় ^এবং $, শুরুতে / বদলে সমগ্র ইনপুট শুরুতে / শেষ একটি লাইনের শেষে মিলে। এটি সাধারণত ডিফল্ট নয়, তবে এই পতাকাগুলির সন্ধানে থাকুন।


2
জেডিবি, ধন্যবাদ এবং আমি আশা করি আপনি এখনও রয়েছেন! আমি ভবিষ্যতে আপনার পোস্টটি পড়ছি :) আপনার উত্তর অবশ্যই 0.24 এবং 2.2 এর যত্ন নিয়েছে এবং সঠিকভাবে 4.2.44 কে বাতিল করে দেয় সবগুলি regex101.com দ্বারা পরীক্ষা করা হয়েছে তবে, এটি 123 কে অস্বীকার করে which যা আপনি বলছেন গ্রহণযোগ্য হতে পারে (এবং আমি এটি মনে করি) হয়!)। আমি আপনার অভিব্যক্তি [- +]? (\ D * [।])? \ D * (নোটস * এর পরিবর্তে + এর পরিবর্তে) পরিবর্তন করে এটি ঠিক করতে পারি তবে পাগল জিনিস পছন্দ করে। (আপনার দ্বিতীয় উদাহরণ) অনুমোদিত। যাইহোক আমার কেক আছে এবং এটি খাওয়া?
ডেভ

2
@ ডেভ -\d+(\.\d*)?|\.\d+
এখনও মনিকা 17

/[-+]?(\d*[.])?\d+/.test("1.bc") // returns true
ইয়েউউ

1
@ আইউউউ হ্যাঁ, কারণ 1.ম্যাচগুলি। যোগ ^এবং $শুরুতে এবং Regex শেষ আপনি শুধুমাত্র পুরো ইনপুট ম্যাচ যদি মেলে চান।
জেডিবি এখনও মনিকা

5
ফ্লোটগুলির এক্সপোজার থাকতে পারে বা নাএন / ইনফ হতে পারে, তাই আমি এটি ব্যবহার করব:, [-+]?(([0-9]*[.]?[0-9]+([ed][-+]?[0-9]+)?)|(inf)|(nan))ই / ডি ফ্লোট / ডাবল নির্ভুলতা ফ্লোটের জন্য।
রেগেক্সের

23

আমি মনে করি না যে লেখার সময় এই পৃষ্ঠায় উত্তরগুলির কোনওটি সঠিক (এসও-তে অন্যত্র আরও অনেক পরামর্শও ভুল)। জটিলতাটি হ'ল আপনাকে নীচের সমস্ত সম্ভাবনার সাথে মিলে যেতে হবে:

  • দশমিক বিন্দু নেই (যেমন একটি পূর্ণসংখ্যার মান)
  • দশমিক বিন্দুর আগে এবং পরে উভয় অঙ্ক (যেমন 0.35, 22.165)
  • দশমিক বিন্দুর আগে সংখ্যাগুলি (যেমন 0., 1234.)
  • দশমিক বিন্দুর পরে অঙ্কগুলি (যেমন .0, .5678)

একই সময়ে, আপনাকে অবশ্যই নিশ্চিত করতে হবে যে কোথাও কোথাও কমপক্ষে একটি অঙ্ক রয়েছে, যেমন নীচের অনুমতি নেই:

  • একটি দশমিক পয়েন্ট তার নিজের
  • কোনও অঙ্ক ছাড়াই স্বাক্ষরিত দশমিক বিন্দু (যেমন +.বা -.)
  • +বা -তাদের নিজস্ব
  • একটি খালি স্ট্রিং

এটি প্রথমে জটিল মনে হয় তবে অনুপ্রেরণা খুঁজে পাওয়ার একটি উপায় java.lang.Double.valueOf(String)পদ্ধতিটির জন্য ওপেনজেডিকে উত্সটি দেখানো ( http://hg.openjdk.java.net/jdk8/jdk8/jdk থেকে শুরু করুন, "ব্রাউজ করুন" ক্লিক করুন, নেভিগেট করুন /src/share/classes/java/lang/এবং Doubleক্লাসটি সন্ধান করুন)। এই শ্রেণীর দীর্ঘকালীন বিভিন্ন সম্ভাবনা পূরণ করে যা ওপি সম্ভবত মনে রাখেনি, কিন্তু সরলতার জন্য উপেক্ষা করছে যা এনএএন, অনন্ত, হেক্সাডেসিমাল নোটেশন এবং এক্সপোজারগুলির সাথে সম্পর্কিত এবং ব্যবহারের \dপরিবর্তে পসিক্স স্বরলিপি ব্যবহার করে একটি একক অঙ্কে, আমি কোনও স্বাক্ষরবিহীন একটি স্বাক্ষরিত ভাসমান পয়েন্ট সংখ্যাটির জন্য রেজেক্সের গুরুত্বপূর্ণ অংশগুলি হ্রাস করতে পারি:

[+-]?((\d+\.?\d*)|(\.\d+))

আমি মনে করি না যে (...)|(...)কোনও অঙ্ক নেই এমন কিছু না ছাড়িয়ে নির্মাণ এড়ানো বা ডেসিমাল পয়েন্টের আগে কোনও সংখ্যা নেই বা তার পরে কোনও অঙ্ক নেই এমন কোনও সম্ভাবনা নিষিদ্ধ করার উপায় রয়েছে বলে আমি মনে করি না ।

স্পষ্টতই অনুশীলনের ক্ষেত্রে আপনাকে পূর্ববর্তী রাজ্যে বা কোডটি ব্যবহার করে যা পূর্ববর্তী সাদা অংশের পূর্ববর্তী বা পূর্ববর্তী শ্বেতস্পেসের জন্য প্রয়োজন।


যদি আপনি সংখ্যার সাথে মিলে যাওয়ার জন্য প্রয়োজনীয়তা যুক্ত করেন 123.তবে হ্যাঁ ... বা সুইচ হ'ল একমাত্র সমাধান, কারণ আমি আমার মূল পোস্টে একটি মন্তব্যে উল্লেখ করেছি।
জেডিবি এখনও মনিকা

1
এটি এবং অন্যান্য / বেশিরভাগ উত্তর, উপেক্ষা করুন যে কোনও ফ্লোটের কোনও এক্সপোঞ্জার থাকতে পারে।
নাটস

1
@ নাটস এটা ঠিক, আমি "এনএন, অনন্ত, হেক্সাডেসিমাল নোটেশন এবং এক্সটেনশনগুলির সাথে সম্পর্কিত যে অংশগুলির সরলতার জন্য উপেক্ষা করেছি" লিখেছি, কারণ এটি ওপির প্রশ্নের ক্ষেত্রের সাথে মেলে বলে মনে হচ্ছে। জেডিকে উত্স কোডটিতে আমি যেটি পেয়েছি সেগুলি সহ আরও প্রায় সম্পূর্ণ বাস্তবায়ন রয়েছে।
pkeller

1
[+-]?((?=\.?\d)\d*\.?\d*)বিকল্পটি এড়ানোর জন্য কি রেজেক্স ব্যবহার করা যেতে পারে? এটি
লুকোচুরি

1
@ 4esn0k নিস রেজেক্স! আমি এটি সঙ্গে প্রায় খেলেছি, এবং এটি কাজ করে। আমার দুটি সতর্কতা রয়েছে: (১) সমস্ত রেজেক্স ইঞ্জিনগুলি শূন্য-প্রস্থের দৃ as় সমর্থনগুলিকে সমর্থন করে না (যদিও বেশিরভাগ আধুনিক আধুনিকগুলি এএফএআইকি করে), এবং (২) চেহারা-সামনের দিকটি অন্য নামে কেবল একটি বিকল্প: ইঞ্জিনটিকে এখনও কিছু চেষ্টা করতে হবে এবং ব্যাকট্র্যাক যদি এটি কাজ না করে তবুও খুব ঝরঝরে ধারণার জন্য একটি উপভোগ করুন ote
pkeller

7

আপনার যা দরকার তা হ'ল:

[\-\+]?[0-9]*(\.[0-9]+)?

আমি "+" এবং "-" চিহ্নটি থেকে রক্ষা পেয়েছি এবং দশমিকের সাথে নিম্নলিখিত সংখ্যার সাথে "1" এর মতো কিছু তৈরি করেছি like একটি বৈধ সংখ্যা নয়।

পরিবর্তনগুলি আপনাকে পূর্ণসংখ্যার এবং ভাসমানগুলির সাথে মেলাতে দেয়। উদাহরণ স্বরূপ:

0
+1
-2.0
2.23442

এই অভিব্যক্তিটির সমস্যাটি হ'ল .1অনুমতি দেওয়া হবে না যদিও এই জাতীয় ইনপুটটি সর্বজনীনভাবে সঠিক হিসাবে স্বীকৃত।
জেডিবি এখনও মনিকাকে

এটি এখন শূন্য দৈর্ঘ্যের স্ট্রিং গ্রহণ করবে -এবং +কোনটি সংখ্যা নয়। রেগেক্স কৌতুকময়! :)
জেডিবি এখনও মনিকার 22

এছাড়াও, এটি অপের আসল প্রশ্নের উত্তর দেয় না, যা এটি কার্যকর \.করে না।
জেডিবি এখনও মনিকার 22

7

বেশিরভাগ ভাষাগুলি বৈধ সংখ্যা বিবেচনা করে (পূর্ণসংখ্যার এবং ভাসমান) মেলাতে চাই:

  • '5' / '-5'

  • '1.0' / '1.' / '.1' / '-1.' / '-.1'

  • '0.45326e+04', '666999e-05', '0.2e-3', '-33.e-1'

মন্তব্য:

  • preceding sign of number ('-' or '+') is optional

  • '-1.' and '-.1' are valid but '.' and '-.' are invalid

  • '.1e3' is valid, but '.e3' and 'e3' are invalid

উভয় '1.' সমর্থন করার জন্য এবং '.1' আমাদের বাদ দিতে হবে তা নিশ্চিত করার জন্য আমাদের একটি ওআর অপারেটর ('|') দরকার। ' মিল থেকে।

[+-]?+/- গাওয়া alচ্ছিক, যেহেতু ?0 বা 1 টি ম্যাচ

( যেহেতু আমাদের কাছে দুটি উপ-এক্সপ্রেশন রয়েছে সেগুলি আমাদের প্রথম বন্ধনে রাখতে হবে

\d+([.]\d*)?(e[+-]?\d+)? এটি একটি অঙ্ক দিয়ে শুরু হওয়া সংখ্যার জন্য

| সাব এক্সপ্রেশন পৃথক করে

[.]\d+(e[+-]?\d+)? এটি '' দিয়ে শুরু হওয়া সংখ্যার জন্য।

) এক্সপ্রেশন শেষ

  • 'এর সাথে শুরু হওয়া সংখ্যার জন্য।

[.] প্রথম অক্ষরটি বিন্দু (বন্ধনীগুলির ভিতরে বা অন্যথায় এটি একটি ওয়াইল্ডকার্ড চরিত্র)

\d+ এক বা একাধিক সংখ্যা

(e[+-]?\d+)? এটি বৈকল্পিক স্বীকৃতি ('বা' শেষের কারণে 0 বা 1 টি ম্যাচ) বৈজ্ঞানিক স্বরলিপি

  • একটি সংখ্যার সাথে শুরু সংখ্যাগুলির জন্য

\d+ এক বা একাধিক সংখ্যা

([.]\d*)? allyচ্ছিকভাবে আমরা এর পরে একটি বিন্দু অক্ষর শূন্য বা আরও বেশি সংখ্যা রাখতে পারি

(e[+-]?\d+)? এটি একটি scientificচ্ছিক বৈজ্ঞানিক স্বরলিপি

  • বৈজ্ঞানিক স্বরলিপি

e আক্ষরিক যা ঘাতক নির্দিষ্ট করে

[+-]? alচ্ছিক সূচক চিহ্ন

\d+ এক বা একাধিক সংখ্যা

এই সমস্ত মিলিত:

[+-]?(\d+([.]\d*)?(e[+-]?\d+)?|[.]\d+(e[+-]?\d+)?)

Eপাশাপাশি গ্রহণ করতে :

[+-]?(\d+([.]\d*)?([eE][+-]?\d+)?|[.]\d+([eE][+-]?\d+)?)

( পরীক্ষার মামলা )


4

এটি সহজ: আপনি জাভা ব্যবহার করেছেন এবং এর \\.পরিবর্তে আপনার ব্যবহার করা উচিত \.(জাভাতে পালিত চরিত্রের সন্ধান করুন)।


আপনি সম্ভবত সঠিক ... ত্রুটি বার্তাটি একটি রেগেক্স পার্সার ত্রুটির পরিবর্তে প্রোগ্রামিং ভাষার সিনট্যাক্স ত্রুটির মতো দেখাচ্ছে।
জেডিবি এখনও মনিকার

3

এই একজন আমার পক্ষে কাজ করেছেন:

(?P<value>[-+]*\d+\.\d+|[-+]*\d+)

আপনি এটি ব্যবহার করতে পারেন (নামকরণের প্যারামিটার ছাড়াই):

([-+]*\d+\.\d+|[-+]*\d+)

এটি পরীক্ষা করার জন্য কিছু অনলাইন রেজেক্স পরীক্ষক ব্যবহার করুন (যেমন: regex101)


2
^[+]?([0-9]{1,2})*[.,]([0-9]{1,1})?$

এটি মিলবে:

  1. 1.2
  2. 12.3
  3. 1,2
  4. 12,3

যতক্ষণ এই কোড স্নিপেট স্বাগত, এবং কিছু সাহায্য প্রদান করতে পারে, এটা হবে ব্যাপকভাবে উন্নত যদি এটা একটি ব্যাখ্যা অন্তর্ভুক্ত এর কিভাবে এবং কেন এই সমাধান সমস্যা। মনে রাখবেন যে আপনি ভবিষ্যতে পাঠকদের জন্য প্রশ্নের উত্তর দিচ্ছেন, কেবল এখনই জিজ্ঞাসা করা ব্যক্তি নয়! দয়া করে ব্যাখ্যা যুক্ত করতে আপনার উত্তর সম্পাদনা করুন, এবং কোন সীমাবদ্ধতা এবং অনুমানগুলি প্রযোজ্য তা একটি ইঙ্গিত দিন।
টবির স্পিড

ওহ, ধন্যবাদ, আমি এটির জন্য লক করছি
সের্গ বুরলাকা

0
[+-]?(([1-9][0-9]*)|(0))([.,][0-9]+)?

[+-]? - leadingচ্ছিক নেতৃস্থানীয় চিহ্ন

(([1-9][0-9]*)|(0)) - একক শূন্য সহ শীর্ষস্থানীয় শূন্য ছাড়াই পূর্ণসংখ্যা

([.,][0-9]+)? - alচ্ছিক ভগ্নাংশ অংশ


1
আরও তথ্য দিন - লোকেদের রেজিজেপস না জানার জন্য এটি হায়ারোগ্লিফস। লোকেরা তাদের জানার জন্য, তাদের এটির দরকার নেই।
পিটারহ - মনিকা

0

সি ++ এ রেজেক্স লাইব্রেরি ব্যবহার করে

উত্তরটি এরকম হবে:

[0-9]?([0-9]*[.])?[0-9]+

খেয়াল করুন যে আমি সাইন প্রতীকটি নিচ্ছি না, আপনি যদি সাইন প্রতীকটি সহ এটি চান তবে এটি এই সম্পর্কে যেতে পারে:

[+-]?([0-9]*[.])?[0-9]+

এটি একটি নিয়মিত সংখ্যা বা দশমিক সংখ্যা পৃথক করে।


0

সি চিহ্নিতকরণে, ভাসমান সংখ্যা নিম্নলিখিত আকারে ঘটতে পারে:

  1. 123
  2. 123।
  3. 123,24
  4. .24
  5. 2e-2 = 2 * 10 পাউ -2 = 2 * 0.1
  6. 4E + 4 = 4 * 10 পাউ 4 = 4 * 10 000

ভাসা নিয়মিত এক্সপ্রেশন তৈরি করার জন্য, আমি প্রথমে "ইনট রেগুলার এক্সপ্রেসন ভেরিয়েবল" তৈরি করব:

(([1-9][0-9]*)|0) will be int

এখন, আমি নিয়মিত এক্সট্রিশনের ছোট ছোট অংশগুলি লিখব - সমাধানটি হ'ল "|" এর সাথে এই অংশগুলিকে একত্রিত করা। "" "।

খন্ডে:

- (([+-]?{int}) satysfies case 1
- (([+-]?{int})"."[0-9]*)  satysfies cases 2 and 3
- ("."[0-9]*) satysfies case 4
- ([+-]?{int}[eE][+-]?{int}) satysfies cases 5 and 6

চূড়ান্ত সমাধান (ছোট অংশগুলি একত্রিত করে):

(([+-]?{int})|(([+-]?{int})"."[0-9]*)|("."[0-9]*)|([+-]?{int}[eE][+-]?{int})


-1

জাভাস্ক্রিপ্ট জন্য

const test = new RegExp('^[+]?([0-9]{0,})*[.]?([0-9]{0,2})?$','g');

যা 1.23 1234.22 0 0.12 12 এর জন্য কাজ করবে

{}দশমিক দৈর্ঘ্য এবং দশমিকের সামনের অংশে আলাদা আলাদা ফলাফল পেতে আপনি অংশগুলি পরিবর্তন করতে পারেন । এটি সংখ্যায় প্রবেশ করতে এবং প্রতিটি ইনপুট পরীক্ষা করার জন্য ইনপুটগুলিতে ব্যবহৃত হয় যেমন আপনি কেবল যা পাস তা অনুমোদন করে।

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