স্ট্রিংটি নিয়মিত অভিব্যক্তির সাথে মেলে কিনা তা জানতে regex.test VS string.match


287

matchস্ট্রিংটি একটি নিয়মিত অভিব্যক্তির সাথে মেলে কিনা তা জানার জন্য আমি অনেক সময় স্ট্রিং ফাংশনটি ব্যবহার করছি ।

if(str.match(/{regex}/))

এর মধ্যে কি কোনও পার্থক্য রয়েছে:

if (/{regex}/.test(str))

তারা কি একই ফল দেবে বলে মনে হচ্ছে?


4
এগুলি আপনি সেরা পরীক্ষাগুলি পাবেন jsperf.com/regexp-test-vs-match-m5
ajax333221

@ ajax333221। Jsperf এর জন্য ধন্যবাদ, তবে আমি নিশ্চিত নই যে এটি ভাল a একটি ম্যাচ গ্রুপ ব্যবহার করে রেজেক্স ম্যাচ, যা বুলিয়ান মান খুঁজলে প্রয়োজন হয় না।
gdoron মনিকা

উত্তর:


440

বেসিক ব্যবহার

প্রথমে, প্রতিটি ফাংশন কী করে তা দেখুন:

regexObjectপরীক্ষা ( স্ট্রিং )

একটি নিয়মিত প্রকাশ এবং একটি নির্দিষ্ট স্ট্রিংয়ের মধ্যে ম্যাচের জন্য অনুসন্ধান চালায়। রিটার্নস সত্য বা মিথ্যা

স্ট্রিংম্যাচ ( RegExp )

নিয়মিত অভিব্যক্তির বিরুদ্ধে স্ট্রিংয়ের সাথে মিল রেখে ম্যাচগুলি পুনরুদ্ধার করতে ব্যবহৃত হয়। ম্যাচগুলির সাথে বা nullযদি কিছুই না থাকে তবে একটি অ্যারে প্রদান করে ।

যেহেতু nullমূল্যায়ন করে false,

if ( string.match(regex) ) {
  // There was a match.
} else {
  // No match.
} 

কর্মক্ষমতা

অভিনয় সম্পর্কে কোনও পার্থক্য আছে?

হ্যাঁ । আমি এই সংক্ষিপ্ত নোটটি এমডিএন সাইটে পেয়েছি :

আপনার যদি স্ট্রিংটি নিয়মিত এক্সপ্রেশন রেজিপ্সপ-এর সাথে মেলে কিনা তা জানতে প্রয়োজন, regexp.test (স্ট্রিং) ব্যবহার করুন।

পার্থক্য কি তাৎপর্যপূর্ণ?

উত্তরটি আরও একবার হ্যাঁ ! এই জেএসফ্রি আমি একসাথে রেখেছি ব্রাউজারের উপর নির্ভর করে পার্থক্যটি 30% - ~ 60% দেখায় :

পরীক্ষা বনাম ম্যাচ |  কর্মক্ষমতা পরীক্ষা

উপসংহার

.testআপনি যদি দ্রুত বুলিয়ান চেক চান তবে ব্যবহার করুন । ব্যবহার করুন .matchযখন ব্যবহার সব ম্যাচ পুনরুদ্ধার করতে gবিশ্বব্যাপী পতাকা।


5
স্ট্রিং ফাংশনটির চারপাশে জিনিসগুলি ফ্লিপ করা এবং তারপরে কোনও মিল থাকলে অ্যারে তৈরি করা দরকার বলে খুব অবাক হন না। দেখে মনে হচ্ছে আমি ব্যবহার চালিয়ে যাচ্ছি .test()। :)

22
আমার দুটি সেন্ট: কর্মক্ষমতা ওভাররেটেড। যে কোনও বিকল্প একটি মনিটরের ঝাঁকুনিতে ,000 15,000 অপারেশন করতে পারে, সুতরাং আপনি যদি বাল্ক রেজেক্স ক্লায়েন্ট-সাইড না করেন তবে গতি প্রাসঙ্গিক নয়। অবশ্যই 'পরীক্ষা' যুক্তিযুক্তভাবে সঠিক ফাংশন যদি কোনও বুলিয়ান ফলাফল আপনি পরে যা করেন। প্রশ্ন / এ বিটিডাব্লু এর জন্য ধন্যবাদ
ডেভিড গিলবার্টসন

2
আকর্ষণীয়ভাবে পরীক্ষাটি আমার উপরে উপরের jscreen পরীক্ষা (ক্রোম 41, ওএসএক্স) ব্যবহার করে ম্যাচের চেয়ে 41% ধীর।
বেঞ্জি

1
@AlexShilman indexOf মধ্যে (কিন্তু অনেক না) পরীক্ষা চেয়ে এই অনুযায়ী দ্রুততর stackoverflow.com/questions/183496/... (আপনি দ্রুত এটা হতে আশা করতে চাই)।
21:51

1
আপনাকে এখানে দংশন করতে পারে এমন একটি জিনিস (এটি সম্প্রতি আমার দলকে বিট করে): আপনি যদি নিজের রেজেক্সে 'জি' পতাকা ব্যবহার করেন এবং একটি নতুন উদাহরণ তৈরি করেন (যেমন নতুন রেজিএক্সপ্যাকের মাধ্যমে (<রিজেক্স_স্ট্রেল, 'জি')) এবং আপনি এটি পুনরায় ব্যবহার করেন উদাহরণস্বরূপ, "পরীক্ষা" চালানো রাষ্ট্রীয়, অর্থাত্ একাধিকবার চালানোর সময় বিভিন্ন ফলাফল প্রদান করবে। বিশদের জন্য বিকাশকারী.মোজিলা.আর.এন.এন- ইউএস / ডকস / ওয়েবে / জাভা স্ক্রিপ্ট / রেফারেন্স / দেখুন দেখুন ।
দ্যাভেট্রন

118

আপনার regexp এ বিশ্বব্যাপী পতাকাটি বিবেচনা করতে ভুলবেন না:

var reg = /abc/g;
!!'abcdefghi'.match(reg); // => true
!!'abcdefghi'.match(reg); // => true
reg.test('abcdefghi');    // => true
reg.test('abcdefghi');    // => false <=

এর কারণ এটি যখন একটি নতুন ম্যাচ পাওয়া যায় তখন রেজিএক্সপাস্ট লাস্ট ইন্ডেক্সের উপর নজর রাখে।


21
আমি কেবল মাথা ঘুরে দেখছিলাম যে আমার regex.est () এলোমেলোভাবে "সত্য" তখন "মিথ্যা" তারপর "সত্য" লগইন করছে ... ধন্যবাদ!
অ্যাড্রেডেনাট

7
আমি মনে করি এটি আরও ভাল উত্তর। এটি ব্যাখ্যা করে যে তারা একই ফলাফল দেয় না এবং Reg.test () এর একটি বিপজ্জনক ক্ষতি হয়। আমার কাছে এটি স্ট্রিং.ম্যাচ () পরিষ্কার করে দেয়। পারফরম্যান্স আমার পক্ষে কখনই কোনও সমস্যা ছিল না।
জেমস

2
এটা গুরুত্বপূর্ণ! প্রতিটি অন্যান্য ফলাফল কেন অনুপস্থিত তা খুঁজে বের করার চেষ্টা করতে গিয়ে পাগল হচ্ছেন ... এটি খুঁজে পাওয়া অন্য যে কোনও ব্যক্তির রেফারেন্সের জন্য: developer.mozilla.org/en-US/docs/Web/JavaScript/References/…
ড্যান

2
আপনি যেমন আমার মতই বিভ্রান্ত হন তবে stackoverflow.com/q/1520800/3714913 দেখুন । এছাড়াও স্ট্রিং.প্রোটোটাইপ.সার্চ () রয়েছে , যা একটি সূচক ফেরত দেয় তবে আমি যতটা বলতে পারি তেমন সমস্যা নেই।
নাটোয়ামি

3
শুধু কৌতূহলী, এর জন্য একটি বিশ্ব পতাকা থাকার বিন্দুটি কী .test()? .test()স্ট্রিংয়ের একটি মিলে যাওয়া রিজেপ্সপ আছে কিনা তা পরীক্ষা করে দেখার বিষয় নয় ?
বুহবাং

0

এটি আমার মানদণ্ডের ফলাফল মানদণ্ডের ফলাফল

পরীক্ষা 4,267,740 অপ্স / সেকেন্ড 32 1.32% (60 টি নমুনাযুক্ত)

এক্সিকিউশন 3,649,719 অপস / সেকেন্ড ± 2.51% (60 টি নমুনাযুক্ত)

ম্যাচ 3,623,125 অপস / সেকেন্ড 85 1.85% (62 টি নমুনাযুক্ত)

সূচক 6,230,325 অপস / সেকেন্ড 95 0.95% (62 টি নমুনা দেওয়া)

পরীক্ষার পদ্ধতিটি ম্যাচের পদ্ধতির চেয়ে দ্রুত, তবে দ্রুততম পদ্ধতিটি ইনডেক্স অফ


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