সংস্করণ নম্বর পার্সিংয়ের জন্য একটি রেজেেক্স


86

আমার কাছে নিম্নলিখিত ফর্মটির একটি সংস্করণ নম্বর রয়েছে:

version.release.modifications

যেখানে সংস্করণ, প্রকাশ এবং পরিবর্তনটি হয় ডিজিটের সেট বা '*' ওয়াইল্ডকার্ড চরিত্র। অতিরিক্তভাবে, এই সংখ্যাগুলির (এবং কোনও পূর্ববর্তী) অনুপস্থিত হতে পারে।

সুতরাং নিম্নলিখিতটি বৈধ এবং পার্স হিসাবে রয়েছে:

1.23.456 = version 1, release 23, modification 456
1.23     = version 1, release 23, any modification
1.23.*   = version 1, release 23, any modification
1.*      = version 1, any release, any modification
1        = version 1, any release, any modification
*        = any version, any release, any modification

তবে এগুলি বৈধ নয়:

*.12
*123.1
12*
12.*.34

মুক্তি, সংস্করণ এবং সংশোধন নম্বরগুলি যাচাই করতে ও পুনরুদ্ধার করতে কেউ আমাকে একটি অতি-জটিল জটিল রেজেক্স সরবরাহ করতে পারে?


আমি নিশ্চিত না যে একটি "সাধারণ" সম্ভব।
সোভিস্ট

উত্তর:


98

আমি ফর্ম্যাটটি প্রকাশ করব:

"১-৩ বিন্দু-বিভক্ত উপাদানগুলি, প্রতিটি সংখ্যাটি ব্যতীত শেষটি হতে পারে *

একটি regexp হিসাবে, এটি:

^(\d+\.)?(\d+\.)?(\*|\d+)$

[যুক্ত করার জন্য সম্পাদনা করুন: এই সমাধানটি বৈধতা দেওয়ার একটি সংক্ষিপ্ত উপায়, তবে এটি চিহ্নিত করা হয়েছে যে মানগুলি তোলার জন্য অতিরিক্ত কাজ প্রয়োজন। রিজএক্সপ্লেক্সকে জটিল করে, বা মিলিত গোষ্ঠীগুলির প্রক্রিয়াজাতকরণের মাধ্যমে এটি মোকাবেলা করা উচিত কিনা স্বাদের বিষয়।

আমার সমাধানে, দলগুলি "."অক্ষরগুলি ক্যাপচার করে । এটি অ্যাজবারির উত্তরের মতো নন-ক্যাপচারিং গ্রুপগুলি ব্যবহার করে মোকাবেলা করা যেতে পারে।

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

Regexp পরে উভয় ইস্যু মোকাবেলা করতে পার্ল কোড কিছু হতে পারে:

@version = ();
@groups = ($1, $2, $3);
foreach (@groups) {
    next if !defined;
    s/\.//;
    push @version, $_;
}
($major, $minor, $mod) = (@version, "*", "*");

যা আসলে বিভাজনের চেয়ে কোনও ছোট নয় "." ]


4
কিছু নন-ক্যাপচারিং গ্রুপ যুক্ত করা (নীচে আমার উত্তর দেখুন) এর অর্থ হ'ল ক্যাপচারিং গোষ্ঠীগুলি অনুসরণ করে না '' ' ^ (?: (\ d +) \।)? (?: (\ d +) \।)? (* | \ d +) $ ধন্যবাদ!
অ্যান্ড্রু বর্লে

এই একমাত্র সমস্যা - খুব সুন্দর এবং পরিষ্কার প্রস্তাব হওয়ায় - গ্রুপগুলি ঠিক নয় কারণ 1.2 লোভের কারণে প্রথমটি 1 এবং 2 তৃতীয় গ্রুপে বন্দী করবে।
jrudolph

40

রিজেক্স ব্যবহার করুন এবং এখন আপনার দুটি সমস্যা আছে। আমি জিনিসটি বিন্দুগুলিতে বিভক্ত করব ("।"), তারপরে নিশ্চিত হয়ে নিন যে প্রতিটি অংশ হয় একটি ওয়াইল্ডকার্ড বা অঙ্কের সেট (রেজেেক্স এখন নিখুঁত)। যদি জিনিসটি বৈধ হয় তবে আপনি বিভাজনের সঠিক অংশটি ফিরিয়ে দিন।


12

এটি কাজ করতে পারে:

^(\*|\d+(\.\d+){0,2}(\.\*)?)$

শীর্ষ স্তরে, "*" একটি বৈধ সংস্করণ সংখ্যার একটি বিশেষ কেস। অন্যথায়, এটি একটি সংখ্যা দিয়ে শুরু হয়। তারপরে শূন্য, এক, বা দুটি ".nn" অনুক্রম রয়েছে, তার পরে একটি alচ্ছিক "। *" হবে। এই রেজেক্সটি 1.2.3 গ্রহণ করবে * * যা আপনার আবেদনে অনুমোদিত বা নাও থাকতে পারে।

মিলছে ক্রমগুলি বিশেষত (\.\d+){0,2}অংশটি পুনরুদ্ধার করার কোডটি আপনার নির্দিষ্ট রেজেক্স লাইব্রেরির উপর নির্ভর করবে।


দুর্দান্ত উত্তর! আমি মনে করি আপনার 1.2.3.4 মিলানো রোধ করতে আপনার অনির্কেড * {0,2 for এর জন্য অদলবদল করা উচিত। আপনার রিজেক্সপ লাইব্রেরির উপর নির্ভর করে আপনি the (<প্যাটার্ন>) the তে প্যাটার্নটি আবদ্ধ করতে চাইতে পারেন যদি আপনি কেবল কোনও ম্যাচের পরিবর্তে অনুসন্ধান করতে পারেন।
ডেভ ওয়েব

থেকে ^ থেকে একটু নড়চড় (।।।? * | \ D + (\ \ D +) {0,1} (: (\ *) | (\ \ D +))) $ খুব 1.2.3 বাতিল হবে *।
পিটার

4
পিটার: আমি মনে করি আমি এখন যেখানে থাকি সেখানে থামব। এটি দ্রুত "এখন আপনার দুটি সমস্যা আছে" অঞ্চলে প্রবেশ করছে। :)
গ্রেগ হিউগিল

12

সমস্ত প্রতিক্রিয়া জন্য ধন্যবাদ! এই টেক্কা :)

ওয়ানবায়নের উত্তরের উপর ভিত্তি করে (যা আমার কাছে সবচেয়ে সহজ দেখাচ্ছে), আমি কিছু নন-ক্যাপচারিং গ্রুপ যুক্ত করেছি ('(?:' অংশগুলি - আমাকে নন-ক্যাপচারিং গ্রুপগুলির সাথে পরিচয় করিয়ে দেওয়ার জন্য ভনসিকে ধন্যবাদ!), সুতরাং যে দলগুলি কেবল ক্যাপচার করে অঙ্ক বা * অক্ষর ধারণ করে।

^(?:(\d+)\.)?(?:(\d+)\.)?(\*|\d+)$

সবাইকে অনেক ধন্যবাদ!


4
আপনি কি পরিবর্তে এটি আপনার প্রশ্নের সম্পাদনা হিসাবে যুক্ত করতে পারেন? এইভাবে সঠিক উত্তরগুলি শীর্ষের
নিকটে

4
গ্রুপ নামের সাথে: ^ (: (<প্রধান> \ D +) \?।)? (:। (<ছোটখাট> \ D +) \)? (? <বিল্ড> * | \ D +) $
javacavaj

4
সমর্থন semversion (আরও কিছু)। - "1.2.3-alpha + abcdedf.lalal" -match "^ (?: (\ D +) \।)? (?: ((\ D +) \।)?)? (* | \ D +)? (?: \ - ([এ-জা-z0-9]।] +))? (?: \ + ([এ-জা-জে -00 -9]।] +))? $ "
স্যাম

সতর্ক থাকুন যে কোনও সংখ্যার সমন্বিত কোনও সংস্করণের ক্ষেত্রে (\*|\d+)এটি প্রথম ^(?:(\d+)\.)?গ্রুপ নয় তৃতীয় দ্বারা মিলিত হবে ।
পাইওটর ডব্রোগস্ট

9

আমার 2 সেন্ট: আমার এই দৃশ্যটি ছিল: আমাকে স্ট্রিং আক্ষরিকের বাইরে সংস্করণ সংখ্যাগুলি পার্স করতে হয়েছিল। (আমি জানি এটি মূল প্রশ্নের থেকে খুব আলাদা, তবে সংস্করণ সংখ্যাটি পার্স করার জন্য একটি রেজেেক্স সন্ধান করতে গুগলিং এই থ্রেডটিকে উপরে দেখিয়েছে, সুতরাং এই উত্তরটি এখানে যুক্ত করুন)

সুতরাং স্ট্রিং আক্ষরিক কিছু হবে: "পরিষেবা সংস্করণ 1.2.35.564 চলছে!"

আমি এই আক্ষরিক থেকে 1.2.35.564 কে পার্স করতে হয়েছিল। @ অজবুরলে থেকে কিউ নিচ্ছেন, আমার রেজেক্সটি নিম্নরূপ:

(?:(\d+)\.)?(?:(\d+)\.)?(?:(\d+)\.\d+)

এটি দেখতে নীচের মতো দেখতে একটি ছোট সি # স্নিপেট:

void Main()
{
    Regex regEx = new Regex(@"(?:(\d+)\.)?(?:(\d+)\.)?(?:(\d+)\.\d+)", RegexOptions.Compiled);

    Match version = regEx.Match("The Service SuperService 2.1.309.0) is Running!");
    version.Value.Dump("Version using RegEx");   // Prints 2.1.309.0        
}

আমি জানি আপনি একটি বিকল্প পরিস্থিতি এবং কেস বর্ণনা করছেন, তবে কেবল সম্পূর্ণ হওয়ার জন্য: SemVer এর সংস্করণের স্ট্রিংটি বিন্যাসের X.Y.Z(সুতরাং, তিনটি অংশে) প্রয়োজন, যেখানে X এবং Y অবশ্যই অ-নেতিবাচক পূর্ণসংখ্যা এবং না অতিরিক্ত নেতৃস্থানীয় শূন্য। Semver.org দেখুন ।
জোহেম শুলেনক্লাপ্পার

4
@ জোহেমসচুলেনক্লোপার্পার ধন্যবাদ, আমি সেমওয়ার সম্পর্কে সচেতন, যদিও প্রশ্নটি সেমওয়ার সম্পর্কে কিছু উল্লেখ করে না।
সুধাংশু মিশ্র

4
সত্য। আমাকে এই প্রশ্নটি সেমওয়ার স্ট্রিংগুলি পার্স করার বিষয়ে একজন সহকর্মী দ্বারা উল্লেখ করা হয়েছিল, যাতে আমার উত্তরগুলি পড়তে ফ্রেম হয়।
জোহেম শুলেনক্লাপ্প্পার

8

আপনি কী প্ল্যাটফর্মে আছেন তা জানেন না তবে .NET- এ সিস্টেম রয়েছে ers সংস্করণ শ্রেণিটি আপনার জন্য "nnnn" সংস্করণ নম্বরগুলি পার্স করবে।


না, এটি সংস্করণ 1.0 থেকে রয়েছে
ডানকান স্মার্ট

6

আমি বিভক্ত পরামর্শ সঙ্গে একমত প্রবণতা।

IV পার্ল আপনার সমস্যার জন্য একটি "পরীক্ষক" তৈরি করেছে

#!/usr/bin/perl -w


@strings = ( "1.2.3", "1.2.*", "1.*","*" );

%regexp = ( svrist => qr/(?:(\d+)\.(\d+)\.(\d+)|(\d+)\.(\d+)|(\d+))?(?:\.\*)?/,
            onebyone => qr/^(\d+\.)?(\d+\.)?(\*|\d+)$/,
            greg => qr/^(\*|\d+(\.\d+){0,2}(\.\*)?)$/,
            vonc => qr/^((?:\d+(?!\.\*)\.)+)(\d+)?(\.\*)?$|^(\d+)\.\*$|^(\*|\d+)$/,
            ajb => qr/^(?:(\d+)\.)?(?:(\d+)\.)?(\*|\d+)$/,
            jrudolph => qr/^(((\d+)\.)?(\d+)\.)?(\d+|\*)$/
          );

  foreach my $r (keys %regexp){
    my $reg = $regexp{$r};
    print "Using $r regexp\n";
foreach my $s (@strings){
  print "$s : ";

    if ($s =~m/$reg/){
    my ($main, $maj, $min,$rev,$ex1,$ex2,$ex3) = ("any","any","any","any","any","any","any");
    $main = $1 if ($1 && $1 ne "*") ;
    $maj = $2 if ($2 && $2 ne "*") ;
    $min = $3 if ($3 && $3 ne "*") ;
    $rev = $4 if ($4 && $4 ne "*") ;
    $ex1 = $5 if ($5 && $5 ne "*") ;
    $ex2 = $6 if ($6 && $6 ne "*") ;
    $ex3 = $7 if ($7 && $7 ne "*") ;
    print "$main $maj $min $rev $ex1 $ex2 $ex3\n";

  }else{
  print " nomatch\n";
  }
  }
print "------------------------\n";
}

বর্তমান আউটপুট:

> perl regex.pl
Using onebyone regexp
1.2.3 : 1. 2. 3 any any any any
1.2.* : 1. 2. any any any any any
1.* : 1. any any any any any any
* : any any any any any any any
------------------------
Using svrist regexp
1.2.3 : 1 2 3 any any any any
1.2.* : any any any 1 2 any any
1.* : any any any any any 1 any
* : any any any any any any any
------------------------
Using vonc regexp
1.2.3 : 1.2. 3 any any any any any
1.2.* : 1. 2 .* any any any any
1.* : any any any 1 any any any
* : any any any any any any any
------------------------
Using ajb regexp
1.2.3 : 1 2 3 any any any any
1.2.* : 1 2 any any any any any
1.* : 1 any any any any any any
* : any any any any any any any
------------------------
Using jrudolph regexp
1.2.3 : 1.2. 1. 1 2 3 any any
1.2.* : 1.2. 1. 1 2 any any any
1.* : 1. any any 1 any any any
* : any any any any any any any
------------------------
Using greg regexp
1.2.3 : 1.2.3 .3 any any any any any
1.2.* : 1.2.* .2 .* any any any any
1.* : 1.* any .* any any any any
* : any any any any any any any
------------------------

এটি দুর্দান্ত হবে, যেহেতু ওয়ানবায়নের চেহারাটি সবচেয়ে সোজা।
jrudolph

আপনারও ভুল পরীক্ষা করা উচিত। আপনি ওয়ানবায়নের ডটস উদ্ধৃত করতে মিস করেছেন।
jrudolph

বিন্দুগুলি, এবং আরও রেজিজেপস সহ আপডেট হয়েছে
স্যুইরিস্ট

5
^(?:(\d+)\.)?(?:(\d+)\.)?(\*|\d+)$

সম্ভবত আরও সংক্ষিপ্ত একটি হতে পারে:

^(?:(\d+)\.){0,2}(\*|\d+)$

এরপরে এটি 1.2.3.4.5-এ উন্নত করা যেতে পারে or


5

এটি আপনার নির্ধারিত কাজের জন্য কাজ করা উচিত। এটি ওয়াইল্ড কার্ডের অবস্থানের সাথে জড়িত এবং নেস্টেড রেজেক্স:

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

http://imgur.com/3E492.png


5

আমি অনেক উত্তর দেখেছি, কিন্তু ... আমার কাছে একটি নতুন উত্তর আছে। এটি আমার পক্ষে অন্তত কাজ করে। আমি একটি নতুন বাধা যুক্ত করেছি। সংস্করণ নম্বরগুলি অন্যদের অনুসরণ করা কোনও জিরো দিয়ে শুরু করতে পারে না (প্রধান, গৌণ বা প্যাচ)।

01.0.0 বৈধ নয় 1.0.0 বৈধ 10.0.10 বৈধ 1.0.0000 বৈধ নয়

^(?:(0\\.|([1-9]+\\d*)\\.))+(?:(0\\.|([1-9]+\\d*)\\.))+((0|([1-9]+\\d*)))$

এটি পূর্ববর্তী একটি ভিত্তিতে তবে আমি এই সমাধানটি আরও ভালভাবে দেখছি ... আমার জন্য;)

উপভোগ করুন !!!


4

আরেকবার চেষ্টা করুন:

^(((\d+)\.)?(\d+)\.)?(\d+|\*)$

এটি 4,5,6 গ্রুপগুলিতে তিনটি অংশ দেয় কিন্তু সেগুলি ডানদিকে আবদ্ধ। সুতরাং 4,5 বা 6 এর প্রথম অ-নাল এক সংস্করণ ক্ষেত্র দেয়।

  • 1.2.3 দেয় 1,2,3
  • 1.2। * 1,2 দেয় *
  • 1.2 নাল দেয়, 1,2
  • *** নাল, নাল দেয় *
  • 1. * নাল দেয়, 1, *

4

সংস্করণ সংখ্যার জন্য আমার অনুসন্ধান / মিলের প্রয়োজন ছিল, এটি মেভেন কনভেনশন বা এমনকি একটি একক সংখ্যা অনুসরণ করে। তবে কোনও অবস্থাতেই কোনও যোগ্যতা অর্জনকারী নয়। এটি অদ্ভুত ছিল, আমার সময় লেগেছিল তখন আমি এটি নিয়ে এসেছি:

'^[0-9][0-9.]*$'

এটি সংস্করণটি নিশ্চিত করে,

  1. একটি অঙ্ক দিয়ে শুরু হয়
  2. যে কোনও সংখ্যক সংখ্যা থাকতে পারে
  3. কেবলমাত্র সংখ্যা এবং '' ' অনুমতি দেওয়া হয়

একটি অসুবিধা হ'ল সংস্করণটি এমনকি 'দিয়ে শেষ হতে পারে। তবে এটি ভার্সনের অনির্দিষ্ট দৈর্ঘ্য পরিচালনা করতে পারে (আপনি যদি এটি বলতে চান তবে উন্মাদ সংস্করণ)

ম্যাচ:

  • 1.2.3
  • 1.09.5
  • 3.4.4.5.7.8.8।
  • 23.6.209.234.3

আপনি 'নাখোশ না হলে'। শেষ, হতে পারে আপনি যুক্তি যুক্তির সাথে একত্রিত করতে পারেন


শেষ (\d+)(.\d+)*
অঙ্কটি

3
(?ms)^((?:\d+(?!\.\*)\.)+)(\d+)?(\.\*)?$|^(\d+)\.\*$|^(\*|\d+)$

আপনার 6 প্রথম উদাহরণের সাথে ঠিক মেলে এবং 4 জনকে প্রত্যাখ্যান করে

  • গোষ্ঠী 1: বড় বা বড়.মিনিয়ার বা '*'
  • গ্রুপ 2 উপস্থিত থাকলে: নাবালক বা *
  • গ্রুপ 3 উপস্থিত থাকলে: *

আপনি '(? এমএস) মুছে ফেলতে পারেন'
আমি কুইকরেক্সের মাধ্যমে মাল্টি-লাইনে প্রয়োগ করার জন্য এই রেজিএক্সপ্যাক্সকে নির্দেশ করতে ব্যবহার করেছি


3

এটি 1.2.3 এর সাথেও মেলে * *

^ (* | \ d + (। \ d +) {0,2} (। *)?) $

আমি কম মার্জিত প্রস্তাব করব:

(* | \ d + (। \ d +)? (। *)?) | \ d +। \ d +। \ d +)


3

মনে রাখবেন রেজিএক্সপ লোভী, সুতরাং আপনি যদি কেবল ভার্সন নম্বর স্ট্রিংয়ের মধ্যে অনুসন্ধান করছেন এবং কোনও বড় পাঠ্যের মধ্যে না থেকে থাকেন তবে আপনার স্ট্রিংয়ের শুরু এবং শেষ চিহ্নিত করতে ^ এবং use ব্যবহার করুন। গ্রেগের থেকে রেজিপেক্সটি দুর্দান্ত কাজ করছে বলে মনে হচ্ছে (এটি কেবলমাত্র আমার সম্পাদকের কাছে দ্রুত চেষ্টা করেছে), তবে আপনার গ্রন্থাগার / ভাষার উপর নির্ভর করে প্রথম অংশটি এখনও ভুল সংস্করণ সংখ্যার মধ্যে "*" এর সাথে মেলে match সম্ভবত আমি কিছু মিস করছি, যেহেতু আমি এক বছর বা তার বেশি সময় ধরে রেজিপ্সপ ব্যবহার করি নি।

এটি নিশ্চিত হওয়া উচিত যে আপনি কেবল সঠিক সংস্করণ নম্বরগুলি খুঁজে পেতে পারেন:

^ (\ * | \ d + (\। \ d +) * (\। \ *)?) $

সম্পাদনা করুন: গ্রেগ ইতিমধ্যে তাদের যুক্ত করেছে এবং এমনকি তার সমাধানের উন্নতি করেছে, আমি খুব ধীর আছি :)


3

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

^(\*|(\d+(\.(\d+(\.(\d+|\*))?|\*))?))$

আইএমও (আমি ব্যাপকভাবে পরীক্ষিত হইনি) এটি ইনপুটটির জন্য বৈধকারক হিসাবে কাজ করতে পারে, তবে সমস্যাটি হ'ল এই রেজেক্স উপাদানগুলি পুনরুদ্ধারের কোনও উপায় সরবরাহ করে না। তার জন্য আপনাকে এখনও পিরিয়ডে বিভক্ত করতে হবে।

এই সমাধানটি সর্ব-এক-এক নয়, তবে বেশিরভাগ সময় প্রোগ্রামিংয়ের প্রয়োজন হয় না। অবশ্যই এটি আপনার কোডে থাকতে পারে এমন অন্যান্য বিধিনিষেধের উপর নির্ভর করে।


3

এক্সএসডি উপাদানগুলি উল্লেখ করে:

<xs:simpleType>
    <xs:restriction base="xs:string">
        <xs:pattern value="[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}(\..*)?"/>
    </xs:restriction>
</xs:simpleType>

3

আমি এটিকে একটি ভাল অনুশীলন হিসাবে গ্রহণ করি - vparse , যার একটি ছোট কার্যকারিতা রয়েছে, একটি সাধারণ ফাংশন সহ:

function parseVersion(v) {
    var m = v.match(/\d*\.|\d+/g) || [];
    v = {
        major: +m[0] || 0,
        minor: +m[1] || 0,
        patch: +m[2] || 0,
        build: +m[3] || 0
    };
    v.isEmpty = !v.major && !v.minor && !v.patch && !v.build;
    v.parsed = [v.major, v.minor, v.patch, v.build];
    v.text = v.parsed.join('.');
    return v;
}

3

এই বিধিগুলি অনুসরণ করে এমন সংস্করণ নম্বরগুলি পার্সিংয়ের জন্য: - কেবলমাত্র অঙ্ক এবং বিন্দু - কোনও বিন্দুর সাথে শুরু বা শেষ হতে পারে না - একসাথে দুটি বিন্দু হতে পারে না

এইটি আমার সাথে চালাকি করেছিল।

^(\d+)((\.{1}\d+)*)(\.{0})$

বৈধ কেসগুলি হ'ল:

1, 0.1, 1.2.1



2

কখনও কখনও সংস্করণ সংখ্যায় আলফানিউমেরিক গৌণ তথ্য থাকতে পারে (উদাঃ 1.2.0 বি বা 1.2.0-বিটা )। এই ক্ষেত্রে আমি এই রেজেক্স ব্যবহার করছি:

([0-9]{1,4}(\.[0-9a-z]{1,6}){1,5})

1

আমি এটি খুঁজে পেয়েছি এবং এটি আমার পক্ষে কাজ করে:

/(\^|\~?)(\d|x|\*)+\.(\d|x|\*)+\.(\d|x|\*)+
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.