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 के लिए धन्यवाद, लेकिन मुझे यकीन नहीं है कि यह एक अच्छा है। मैच समूह का उपयोग करके रेगेक्स मैच, जो एक बूलियन मूल्य देखते समय की आवश्यकता नहीं है।
गॉर्डोरॉन

जवाबों:


440

मूल उपयोग

सबसे पहले, देखते हैं कि प्रत्येक फ़ंक्शन क्या करता है:

regexObjectपरीक्षण ( स्ट्रिंग )

एक नियमित अभिव्यक्ति और एक निर्दिष्ट स्ट्रिंग के बीच मैच की खोज को निष्पादित करता है। सच्चा या झूठा लौटाता है

तारमैच ( RegExp )

एक नियमित अभिव्यक्ति के खिलाफ एक स्ट्रिंग से मेल खाते समय मैचों को पुनः प्राप्त करने के लिए उपयोग किया जाता है। मैचों के साथ एक सरणी देता है याnull यदि कोई नहीं है।

चूंकि nullमूल्यांकन करने के लिए false,

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

प्रदर्शन

क्या प्रदर्शन को लेकर कोई मतभेद है?

जी हां । मुझे यह छोटा नोट MDN साइट में मिला :

यदि आपको यह जानने की जरूरत है कि क्या एक स्ट्रिंग एक रेगुलर एक्सप्रेशन रेगेक्सप से मेल खाता है, तो रेगेक्सपीस्ट (स्ट्रिंग) का उपयोग करें।

क्या अंतर महत्वपूर्ण है?

एक बार और जवाब हां है ! इस jsPerf को मैंने एक साथ रखा है यह अंतर दिखाता है ~ 30% - ~ 60% ब्राउज़र के आधार पर:

टेस्ट बनाम मैच |  प्रदर्शन का परीक्षण

निष्कर्ष

.testयदि आप तेजी से बूलियन जांच चाहते हैं तो इसका उपयोग करें। वैश्विक ध्वज .matchका उपयोग करते समय सभी मैचों को पुनः प्राप्त करने के लिए उपयोग करें g


5
बहुत आश्चर्य की बात नहीं है क्योंकि स्ट्रिंग फ़ंक्शन के आसपास चीजों को फ्लिप करने की आवश्यकता है और फिर एक मैच होने पर एरियर बनाएं। लगता है मैं उपयोग करता रहूँगा .test()। :)

22
मेरे दो सेंट: प्रदर्शन ओवररेटेड है। या तो विकल्प एक मॉनिटर के झिलमिलाहट में ~ 15,000 ऑपरेशन कर सकता है, इसलिए जब तक आप थोक रेगेक्स क्लाइंट-साइड नहीं कर रहे हैं, गति प्रासंगिक नहीं है। बेशक 'परीक्षण' तार्किक रूप से सही कार्य है अगर एक बूलियन परिणाम है जो आप के बाद कर रहे हैं। Q / A BTW के लिए धन्यवाद।
डेविड गिल्बर्टसन

2
दिलचस्प बात यह है कि मेरे लिए jsPerf परीक्षण ऊपर (क्रोम 41, OSX) का उपयोग करके मैच की तुलना में 41% धीमा है।
बेन्जी

1
@AlexShilman indexOf इस stackoverflow.com/questions/183496/… के अनुसार परीक्षण की तुलना में तेज़ (लेकिन बहुत अधिक नहीं) है (आप इसे तेज़ होने की उम्मीद करेंगे)।
पॉडपर्सन

1
एक चीज़ जो आपको यहाँ काट सकती है (यह मेरी टीम ने हाल ही में): यदि आप अपने Regex पर 'g' ध्वज का उपयोग करते हैं और एक नया उदाहरण बनाते हैं (अर्थात नए RegExp (<regex_str>, 'g') के माध्यम से) और आप उसका पुनः उपयोग करते हैं उदाहरण के लिए, "परीक्षण" चलना स्टेटफुल है, यानी कई बार चलाने पर अलग-अलग परिणाम मिलेंगे। देखें developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... जानकारी के लिए।
डाइवर्ट्रन

118

अपने फ्लैगशिप में वैश्विक ध्वज को ध्यान में रखना न भूलें:

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

ऐसा इसलिए होता है क्योंकि जब नया मैच मिलता है, तो Regexp lastIndex पर नज़र रखता है।


21
मैं देख रहा था कि मेरे regex.test () बेतरतीब ढंग से "सच" और फिर "झूठे" तब "सच" लॉग कर रहे थे ... धन्यवाद!
adriendenat

7
मुझे लगता है कि यह बेहतर जवाब है। यह बताता है कि वे एक ही परिणाम नहीं देते हैं और उस reg.test () में एक खतरनाक नुकसान होता है। मेरे लिए यह string.match () स्पष्ट विकल्प बनाता है। मेरे लिए प्रदर्शन कभी कोई मुद्दा नहीं रहा।
जेम्स

2
यह महत्वपूर्ण है! पागल यह जानने की कोशिश कर रहा है कि हर दूसरा परिणाम क्यों गायब था ... किसी और के संदर्भ के लिए जो यह पाता है: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Dan

2
यदि आप मेरे जैसे भ्रमित थे, तो stackoverflow.com/q/1520800/3714913 देखें । इसमें String.prototype.search () भी है , जो एक इंडेक्स देता है, लेकिन जहां तक ​​मैं बता सकता हूं, यह समस्या नहीं है।
नटोमामी

3
बस जिज्ञासु, क्या एक वैश्विक ध्वज होने की बात है .test()? यह .test()जांचने की बात नहीं है कि क्या स्ट्रिंग में एक मिलान regexp है?
बुहबंग

0

यह मेरे बेंचमार्क परिणाम हैं बेंचमार्क परिणाम

परीक्षण 4,267,740 ऑप्स / सेकंड 40 1.32% (60 रन नमूना)

निष्पादित 3,649,719 ऑप्स / सेकंड 19 2.51% (60 रन से नमूना)

मैच 3,623,125 ऑप्स / सेकंड 125 1.85% (62 रन नमूना)

इंडेक्सऑफ 6,230,325 ऑप्स / सेकंड (0.95% (62 रनों का नमूना)

परीक्षण विधि मैच विधि की तुलना में तेज़ है, लेकिन सबसे तेज़ विधि इंडेक्सऑफ़ है


indexOf regexes के साथ काम नहीं करता है इसलिए काफी अप्रासंगिक है।
गेदरॉन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.