Javascript에서 정규 표현식 match ()의 위치를 ​​반환합니까?


답변:


225

execindex속성이 있는 객체를 반환합니다 .

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
당신의 도움을 주셔서 감사합니다! 여러 개의 일치하는 색인을 어떻게 찾을 수 있습니까?
stagas

9
참고 :를 re변수로 사용하고 g수정자를 추가하는 것이 모두 중요합니다! 그렇지 않으면 무한 루프가 발생합니다.
oriadam

1
@ OnurYıldırım-여기에 작동하는 jsfiddle이 있습니다 ... IE5까지 다시 테스트했습니다 ... 잘 작동합니다 : jsfiddle.net/6uwn1vof
Jimbo Jonny

1
@ JimboJonny, 흠 잘 새로운 것을 배웠습니다. 내 테스트 사례는을 반환합니다 undefined. jsfiddle.net/6uwn1vof/2 이것은 귀하의 것과 같은 검색 예가 아닙니다.
Onur Yıldırım

1
@ OnurYıldırım- g깃발을 제거하면 작동합니다. match정규식이 아닌 문자열의 함수 이기 때문에 상태를 유지할 수 없으므로 전역 일치를 찾지 않으면 상태 만 중요하지 않기 때문에 (예 : 색인 속성이있는) exec만 처리합니다. exec.
Jimbo Jonny

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끝 위치에서도 작동합니다.
Beni Cherniavsky-Paskin


1
@ BeniCherniavsky-Paskin, 종료 위치가 match.index + match[0].length - 1아닐까요?
David

1
@David, 나는 예를 들어 .slice()and에 의해 배타적 인 최종 위치를 의미했습니다 .substring(). 당신이 말하는 것처럼 포괄적 인 끝은 1 적습니다. (그것이 하나의 빈 일치하는 않는 한, 포함은 일반적으로 경기 내 마지막 문자의 인덱스를 의미주의 전에 일치하고있을 -1시작 빈의 경기를 완전히 문자열 밖에 ...)
베니 Cherniavsky-Paskin

16

에서 developer.mozilla.org 문자열에 문서 .match()방법 :

반환 된 Array에는 구문 분석 된 원래 문자열이 포함 된 추가 입력 속성이 있습니다. 또한 index 속성이 있으며, 이는 문자열에서 일치 항목의 인덱스 (0부터 시작)를 나타냅니다 .

비전 역 정규 표현식을 처리 할 때 (즉, 정규 표현식에 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. "두 번째 주장"이 아닙니다. 함수 인수는 "전체 일치, 그룹 1, 그룹 2, ...., 일치 색인, 전체 문자열 일치"입니다
Mike 'Pomax'Kamermans

2

최신 브라우저에서는 string.matchAll ()으로 이를 수행 할 수 있습니다 .

이 접근 방식의 장점 RegExp.exec()@Gumbo의 답변 에서처럼 정규식이 상태 저장에 의존하지 않는다는 입니다.

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

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


1

이 멤버 fn은 String 객체 내부의 입력 단어에 대한 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 정규식은 미리보기를 사용하여 캡처 외부의 텍스트 조건을 지원합니다. 예를 들어 searchIndex("foobarfoobaz", "foo(?=baz)", true)줘야 [6]하지 [0].
rakslice

왜`[] .forEach.call (arr, function (element)`왜 arr.forEach 또는 arr.map
Ankit Kumar

-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.