जावास्क्रिप्ट में एक रेगेक्स मैच () की स्थिति?


154

वहाँ जावास्क्रिप्ट में एक regex मैच () के परिणामों की एक स्ट्रिंग के अंदर (शुरू) चरित्र पदों को पुनः प्राप्त करने का एक तरीका है?

जवाबों:


225

execएक indexसंपत्ति के साथ एक वस्तु देता है :

var match = /bar/.exec("foobar");
if (match) {
    console.log("match found at " + match.index);
}

और कई मैचों के लिए:

var re = /bar/g,
    str = "foobarfoobar";
while ((match = re.exec(str)) != null) {
    console.log("match found at " + match.index);
}


5
आपकी सहायताके लिए धन्यवाद! क्या आप मुझे यह भी बता सकते हैं कि मुझे कई मैचों के सूचकांक कैसे मिलेंगे?
स्टैगस

9
नोट: reएक चर के रूप में, और gसंशोधक का उपयोग करके दोनों महत्वपूर्ण हैं! अन्यथा आपको एक अंतहीन लूप मिलेगा।
ओरिदम

1
@ OnurYıldırım - यहाँ इसका एक jsfiddle काम कर रहा है ... मैंने इसे IE5 पर वापस करने के लिए सभी तरह से परीक्षण किया है ... महान काम करता है: jsfiddle.net/6uwn1vof
जिम्बो जॉनी

1
@JimboJonny, hm अच्छी तरह से मैंने कुछ नया सीखा है। मेरा टेस्ट केस लौटा undefinedjsfiddle.net/6uwn1vof/2 जो आपके जैसा खोज-जैसा उदाहरण नहीं है।
ओनुर येल्ड्रिम

1
@ OnurYıldırım - gझंडे को हटा दें और यह काम करेगा। चूँकि matchयह स्ट्रिंग का एक कार्य है, न कि रेगेक्स जैसा execकि इसे स्टेटफुल नहीं किया जा सकता है , इसलिए यह केवल इसे व्यवहार करता है exec(जैसे कि एक इंडेक्स प्रॉपर्टी है) यदि आप एक वैश्विक मैच की तलाश में नहीं हैं ... क्योंकि तब राज्य की स्थिति कोई मायने नहीं रखती है। ।
जिम्बो जॉनी

60

यहाँ मैं क्या लेकर आया हूँ:

// Finds starting and ending positions of quoted text
// in double or single quotes with escape char support like \" \'
var str = "this is a \"quoted\" string as you can 'read'";

var patt = /'((?:\\.|[^'])*)'|"((?:\\.|[^"])*)"/igm;

while (match = patt.exec(str)) {
  console.log(match.index + ' ' + patt.lastIndex);
}


18
match.index + match[0].lengthअंत स्थिति के लिए भी काम करता है।
बेनी चेर्नियाव्स्की-पास्किन

वास्तव में अच्छा है - यहाँ तुलना की गई
लुई मैडॉक्स

1
@ BeniCherniavsky-Paskin, क्या अंतिम स्थिति नहीं होगी match.index + match[0].length - 1?
डेविड

1
@ डेविड, मेरा मतलब अनन्य अंत स्थिति है, जैसे कि इसके द्वारा लिया गया .slice()और .substring()। आपके कहने के अनुसार समावेशी अंत 1 कम होगा। (सावधान रहें कि समावेशी का मतलब आमतौर पर मैच के अंदर अंतिम चार का सूचकांक होता है, जब तक कि यह एक खाली मैच न हो जहां यह मैच से पहले 1 हो और -1शुरुआत में खाली मैच के लिए पूरी तरह से स्ट्रिंग के बाहर हो सकता है ...)
बेनी चेर्नियाव्स्की-पस्किन

16

स्ट्रिंग विधि पर developer.mozilla.org डॉक्स से .match():

लौटे एरे में एक अतिरिक्त इनपुट संपत्ति है, जिसमें मूल स्ट्रिंग है जिसे पार्स किया गया था। इसके अलावा, इसमें एक सूचकांक गुण है, जो स्ट्रिंग में मैच के शून्य-आधारित सूचकांक का प्रतिनिधित्व करता है

जब एक गैर-वैश्विक रेगेक्स (यानी, gआपके रेगेक्स पर कोई ध्वज नहीं ) के साथ काम करते हैं, तो उसके द्वारा लौटाए गए मूल्य .match()में एक indexसंपत्ति होती है ... आपको बस इतना करना होगा।

var index = str.match(/regex/).index;

यहाँ एक उदाहरण दिखाया गया है कि यह काम कर रहा है:

var str = 'my string here';

var index = str.match(/here/).index;

alert(index); // <- 10

मैं सफलतापूर्वक IE5 के लिए यह सब तरह से परीक्षण किया है।


6

आप ऑब्जेक्ट की searchविधि का उपयोग कर सकते हैं String। यह केवल पहले मैच के लिए काम करेगा, लेकिन अन्यथा आप जो वर्णन करते हैं वह करेंगे। उदाहरण के लिए:

"How are you?".search(/are/);
// 4

6

यहाँ हाल ही में खोजा गया एक अच्छा फीचर है, मैंने कंसोल पर यह कोशिश की और यह काम करने लगता है:

var text = "border-bottom-left-radius";

var newText = text.replace(/-/g,function(match, index){
    return " " + index + " ";
});

जो लौटा: "बॉर्डर 6 बॉटम 13 ने 18 रेडियस छोड़ा"

तो ऐसा लगता है कि आप क्या देख रहे हैं।


6
बस इस बात से सावधान रहें कि प्रतिस्थापन कार्य कैप्चर समूहों को भी जोड़ते हैं, इसलिए ध्यान दें कि यह प्रतिस्थापन फ़ंक्शन में हमेशा दूसरी-से-अंतिम प्रविष्टि है जो argumentsकि स्थिति है। "दूसरा तर्क" नहीं। फ़ंक्शन तर्क "पूर्ण मिलान, Group1, group2, ...., मैच का सूचकांक, पूर्ण स्ट्रिंग के विरुद्ध मिलान"
माइक 'पोमैक्स' Kamermans

2

आधुनिक ब्राउज़रों में, आप इसे string.matchAll () के साथ पूरा कर सकते हैं ।

इस दृष्टिकोण बनाम RegExp.exec()का लाभ यह है कि यह रेगुक्स के स्टेटफुल होने पर निर्भर नहीं करता है, जैसा कि @ गंबो के उत्तर में है

let regexp = /bar/g;
let str = 'foobarfoobar';

let matches = [...str.matchAll(regexp)];
matches.forEach((match) => {
    console.log("match found at " + match.index);
});


1

यह सदस्य fn स्ट्रिंग-ऑब्जेक्ट के अंदर इनपुट शब्द का, यदि कोई हो, तो 0-आधारित पदों की एक सरणी देता है

String.prototype.matching_positions = function( _word, _case_sensitive, _whole_words, _multiline )
{
   /*besides '_word' param, others are flags (0|1)*/
   var _match_pattern = "g"+(_case_sensitive?"i":"")+(_multiline?"m":"") ;
   var _bound = _whole_words ? "\\b" : "" ;
   var _re = new RegExp( _bound+_word+_bound, _match_pattern );
   var _pos = [], _chunk, _index = 0 ;

   while( true )
   {
      _chunk = _re.exec( this ) ;
      if ( _chunk == null ) break ;
      _pos.push( _chunk['index'] ) ;
      _re.lastIndex = _chunk['index']+1 ;
   }

   return _pos ;
}

अब प्रयास करो

var _sentence = "What do doers want ? What do doers need ?" ;
var _word = "do" ;
console.log( _sentence.matching_positions( _word, 1, 0, 0 ) );
console.log( _sentence.matching_positions( _word, 1, 1, 0 ) );

आप नियमित अभिव्यक्तियों को भी इनपुट कर सकते हैं:

var _second = "z^2+2z-1" ;
console.log( _second.matching_positions( "[0-9]\z+", 0, 0, 0 ) );

यहाँ एक को रैखिक शब्द का स्थिति सूचकांक मिलता है।


1
var str = "The rain in SPAIN stays mainly in the plain";

function searchIndex(str, searchValue, isCaseSensitive) {
  var modifiers = isCaseSensitive ? 'gi' : 'g';
  var regExpValue = new RegExp(searchValue, modifiers);
  var matches = [];
  var startIndex = 0;
  var arr = str.match(regExpValue);

  [].forEach.call(arr, function(element) {
    startIndex = str.indexOf(element, startIndex);
    matches.push(startIndex++);
  });

  return matches;
}

console.log(searchIndex(str, 'ain', true));

यह गलत है। str.indexOfयहाँ केवल मैच द्वारा कब्जा किए गए पाठ की अगली घटना का पता चलता है, जो कि जरूरी नहीं है कि मैच हो। JS regex लुकहैड के साथ कैप्चर के बाहर पाठ की स्थितियों का समर्थन करता है। उदाहरण के लिए searchIndex("foobarfoobaz", "foo(?=baz)", true)देना चाहिए [6], नहीं [0]
रक्सालिस

क्यों `[] .forEach.call (आगमन, समारोह (तत्व)` क्यों नहीं arr.forEach या arr.map
अंकित कुमार

-1
function trimRegex(str, regex){
    return str.substr(str.match(regex).index).split('').reverse().join('').substr(str.match(regex).index).split('').reverse().join('');
}

let test = '||ab||cd||';
trimRegex(test, /[^|]/);
console.log(test); //output: ab||cd

या

function trimChar(str, trim, req){
    let regex = new RegExp('[^'+trim+']');
    return str.substr(str.match(regex).index).split('').reverse().join('').substr(str.match(regex).index).split('').reverse().join('');
}

let test = '||ab||cd||';
trimChar(test, '|');
console.log(test); //output: ab||cd
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.