regexp

2011-04-14 15 views
14

में अक्षरों से ठीक से कैसे बचें I स्ट्रिंग के अंदर एक स्ट्रिंग खोज करना चाहते हैं। बस MySTR.search(Needle) कह रहा है।regexp

समस्या तब होती है जब यह needle स्ट्रिंग में विशेष regex वर्ण जैसे *, + और इसी तरह होते हैं। यह त्रुटि invalid quantifier के साथ विफल रहता है।

मैंने वेब ब्राउज़ किया है और पता चला है कि स्ट्रिंग \Q some string \E से बच सकती है।

हालांकि, यह हमेशा वांछित व्यवहार का उत्पादन नहीं करता है। उदाहरण के लिए:

var sNeedle = '*Stars!*'; 
var sMySTR = 'The contents of this string have no importance'; 
sMySTR.search('\Q' + sNeedle + '\E'); 

परिणाम -1 है। ठीक।

var sNeedle = '**Stars!**'; 
var sMySTR = 'The contents of this string have no importance'; 
sMySTR.search('\Q' + sNeedle + '\E'); 

परिणाम "अवैध मात्रात्मक" है। ऐसा इसलिए होता है क्योंकि 2 या अधिक विशेष वर्ण एक दूसरे को 'स्पर्श' कर रहे हैं, क्योंकि:

var sNeedle = '*Dont touch me*Stars!*Dont touch me*'; 
var sMySTR = 'The contents of this string have no importance'; 
sMySTR.search('\Q' + sNeedle + '\E'); 

ठीक काम करेगा।

मुझे पता है कि मैं escapeAllBadChars(sInStr) फ़ंक्शन कर सकता हूं और प्रत्येक संभावित विशेष रेगेक्स चरित्र से पहले डबल स्लेश जोड़ सकता हूं, लेकिन मुझे आश्चर्य है कि ऐसा करने का एक आसान तरीका है या नहीं?

+3

\ क्यू ... \ ई पर्ल में काम करता है, यकीन है कि के बारे में नहीं हालांकि कहीं और। –

+1

मुझे लगता है कि आपके तीसरे उदाहरण में सितारे आप जो सोचते हैं वह नहीं कर रहे हैं। उन्हें शाब्दिक * वर्णों के रूप में व्याख्या नहीं किया जा रहा है, लेकिन उनके सामने वर्णों के लिए क्वांटिफायर के रूप में। –

+0

@ मैथ्यू, जावा में यह पर्ल में काम करता है (अन्य भाषाओं के बारे में निश्चित नहीं है)। –

उत्तर

30

\Q...\E जावास्क्रिप्ट में काम नहीं करता (कम से कम, वे कुछ भी बच नहीं है ...) के रूप में आप देख सकते हैं:

var s = "*"; 
print(s.search(/\Q*\E/)); 
print(s.search(/\*/)); 

पैदा करता है:

-1 
0 

के रूप में आप देख सकते हैं Ideone पर।

निम्नलिखित वर्ण भाग निकले जाने की जरूरत है:

  • (
  • )
  • [
  • {
  • *
  • +
  • .
  • $
  • ^
  • \
  • |
  • ?

तो, कुछ इस तरह करना होगा:

function quote(regex) { 
    return regex.replace(/([()[{*+.$^\\|?])/g, '\\$1'); 
} 

नहीं, ] और } से बचने की आवश्यकता नहीं है: उनके पास कोई विशेष अर्थ नहीं है, केवल उनके शुरुआती काउंटर पार्ट्स हैं।

ध्यान दें कि एक शाब्दिक regex, /.../ का उपयोग करते समय, आपको / char से बचने की भी आवश्यकता है। हालांकि, / एक रेगेक्स मेटा वर्ण नहीं है: RegExp ऑब्जेक्ट में इसका उपयोग करते समय, इसे बचने की आवश्यकता नहीं है।

+1

जवाब तोड़ने! –

+0

चरित्र/ – lopata

+0

@ थियोज़ से बचने की जरूरत है, मैं '/' de regex मेटा char को कॉल नहीं करूंगा। जब आप एक शाब्दिक regex का उपयोग करते हैं तो इसे केवल एक भागने की जरूरत होती है। 'RegExp' ऑब्जेक्ट के साथ रेगेक्स बनाते समय, इसे बचने की आवश्यकता नहीं होती है। लेकिन चूंकि मैं '/.../ 'के साथ एक उदाहरण देता हूं, इसलिए इसका उल्लेख करना एक अच्छा विचार है। –

1

मैंने यह देखने के लिए एक त्वरित Google खोज की है कि वहां क्या है और ऐसा लगता है कि आपके पास नियमित अभिव्यक्ति वर्णों से बचने के लिए कुछ विकल्प हैं। one page के अनुसार, आप को परिभाषित कर सकते & एक समारोह को चलाने के नीचे की तरह समस्याग्रस्त पात्रों से बचने के लिए:

RegExp.escape = function(text) { 
    return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); 
} 
वैकल्पिक रूप से

, आप कोशिश करते हैं और एक अलग पुस्तकालय जैसे XRegExp, जो पहले से ही बारीकियों आप फिर से करने की कोशिश कर रहे संभालती उपयोग कर सकते हैं का समाधान।

4

मैं सिर्फ जावास्क्रिप्ट में अपने पैरों को डुबो रहा हूं, लेकिन क्या आपको कारण है कि आपको रेगेक्स इंजन का उपयोग करने की आवश्यकता है? कैसे के बारे में

var sNeedle = '*Stars!*'; 
var sMySTR = 'The contents of this string have no importance'; 
if (sMySTR.indexOf(sNeedle) > -1) { 
    //found it 
} 
+0

मैंने वास्तव में इस बारे में सोचा नहीं है। यह सिर्फ मेरे सिर में फंस गया है कि मुझे तारों के साथ .search() .match() .replace() का उपयोग करना चाहिए। असल में, मैं बस इतना करना चाहता हूं कि सरल टेक्स्ट स्ट्रिंग के रूप में sNeedle का उपयोग करें, इसलिए मुझे लगता है कि indexOf निश्चित रूप से एक अच्छा विचार है। – user1651105

0

https://stackoverflow.com/a/6969486/151312

की डुप्लीकेट यह उचित है के अनुसार MDN (ऊपर पोस्ट में विवरण देखें):

function escapeRegExp(str) { 
    return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); 
}