জাভাস্ক্রিপ্টে একটি রেগেক্স ম্যাচের () অবস্থানগুলি ফেরত দেবেন?


154

জাভাস্ক্রিপ্টে একটি রেইগেক্স ম্যাচের ফলাফলের একটি স্ট্রিংয়ের ভিতরে (শুরু) চরিত্রের অবস্থানগুলি পুনরুদ্ধার করার কোনও উপায় আছে কি?

উত্তর:


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
@ ওনুরাইল্ডারম - এটির একটি জিসফিল এখানে কাজ করছে ... আমি আই 5 এর সমস্ত পথে এটি পরীক্ষা করেছি ... দুর্দান্ত কাজ করেছে: jsfiddle.net/6uwn1vof
জনি

1
@ জিম্বো জনি, এইচএম ভাল আমি নতুন কিছু শিখলাম। আমার পরীক্ষার কেস ফিরে আসে undefinedjsfiddle.net/6uwn1vof/2 যা আপনার মতো অনুসন্ধানের মতো উদাহরণ নয়।
ওনুর ইল্ডারিয়াম

1
@ অনুরওয়াল্ডরিম - gপতাকাটি সরান এবং এটি কাজ করবে। যেহেতু matchস্ট্রিংয়ের একটি ফাংশন, রেজেক্সের মতো execএটি রাষ্ট্রীয় হতে পারে না , তাই execআপনি যদি কোনও বিশ্বব্যাপী ম্যাচ না খুঁজছেন তবে এটি কেবল এটির মতো আচরণ করে (অর্থাত্ একটি সূচী সম্পত্তি রয়েছে) ... কারণ তখন রাষ্ট্রীয়তার কোনও গুরুত্ব নেই state ।
জিম্বো জনি

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
@ বেনিচেরনিয়াভস্কি-পাসকিন, শেষের অবস্থানটি কী হবে না match.index + match[0].length - 1?
ডেভিড

1
@ ডেভিড, আমার অর্থ ছিল একচেটিয়া শেষ অবস্থান, যেমন নেওয়া হয়েছে .slice()এবং যেমন .substring()। অন্তর্ভুক্তিমূলক সমাপ্তি আপনি যা বলছেন তেমন 1 কম হবে। (সাবধানতা অবলম্বন করুন যে অন্তর্ভুক্তির সাধারণত শেষ চরের অভ্যন্তরের ম্যাচের সূচক বোঝানো হয়, যদি না এটি খালি ম্যাচ হয় যেখানে ম্যাচের আগে এটি প্রথম হয় এবং -1শুরুতে খালি ম্যাচের জন্য পুরোপুরি স্ট্রিংয়ের বাইরে থাকতে পারে ...)
বেনি চেরনিয়াভস্কি-পাসকিন

16

স্ট্রিং পদ্ধতিতে ডেভেলপার.মোজিলা.অর্গ ডক্স থেকে .match():

প্রত্যাবর্তিত অ্যারেতে একটি অতিরিক্ত ইনপুট সম্পত্তি রয়েছে, এতে পার্স করা হয়েছে এমন মূল স্ট্রিং রয়েছে। উপরন্তু, এটির একটি সূচক সম্পত্তি রয়েছে যা স্ট্রিংয়ে ম্যাচের শূন্য-ভিত্তিক সূচককে উপস্থাপন করে

যখন কোনও অ-গ্লোবাল রেজেেক্স (যেমন, gআপনার রেজেক্সে কোনও পতাকা নেই ) এর সাথে ডিল করার সময় , ফেরত মানটির .match()একটি indexসম্পত্তি থাকে ... আপনাকে যা করতে হবে তা এটিকে অ্যাক্সেস করতে হবে।

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

এখানে এটি উদাহরণস্বরূপ এটি কাজ করে দেখায়:

var str = 'my string here';

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

alert(index); // <- 10

আইই 5-এ ফিরে যাওয়ার আমি পুরোভাবেই এটি পরীক্ষা করেছি have


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
কেবল প্রতিস্থাপন করুন যে প্রতিস্থাপন ফাংশনগুলি ক্যাপচার গ্রুপগুলিও যুক্ত করে, তাই মনে রাখবেন যে প্রতিস্থাপন ফাংশনে এটি সর্বদা দ্বিতীয় থেকে শেষ এন্ট্রি argumentsis "দ্বিতীয় যুক্তি" নয়। ফাংশন আর্গুমেন্টগুলি হ'ল "সম্পূর্ণ ম্যাচ, গ্রুপ 1, গ্রুপ 2, ...., ম্যাচের সূচক, পুরো স্ট্রিং ম্যাচের সাথে মেলে"
মাইক 'পোম্যাক্স' কামারম্যানস

2

আধুনিক ব্রাউজারগুলিতে, আপনি স্ট্রিং.ম্যাচএল () এর মাধ্যমে এটি সম্পাদন করতে পারেন

এই পদ্ধতির 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এখানে কেবলমাত্র ম্যাচের দ্বারা গৃহীত পাঠ্যের পরবর্তী ঘটনাটি পাওয়া যায় যা ম্যাচটি অগত্যা নয়। জেএস রেজেক্স লুপহেড সহ ক্যাপচারের বাইরের পাঠ্যের শর্তাদি সমর্থন করে। উদাহরণস্বরূপ দেওয়া 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.