[Javascript] 정규식에서 g 플래그 사용시 주의 사항
자바스크립트 정규식
https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Regular_Expressions
RegExp.prototype.exec()
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec
RegExp.prototype.test()
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test
//-----------------------------------------------------------------------------
* exec(), test() :
- g 없음 : 첫 결과만 리턴
- g 사용 : 같은 정규식 변수를 연속으로 사용시, 다음 호출에서는 다음 위치부터 검색, exec()와 test()가 다음 검색위치를 서로에게 영향을 줌
var str = 'qa';
var r = /a/;
console.log('11-test', r.test(str), r.test(str)); // true true
console.log('11-exec', r.exec(str), r.exec(str)); // ['a', index: 1, input: 'qa', ...] ['a', index: 1, input: 'qa', ... ]
var r = /a/g; // g 플래그 사용
console.log('1g-test', r.test(str), r.test(str), r.test(str)); // true false true <=== 2번째 호출에서 false
console.log('1g-exec', r.exec(str), r.exec(str), r.exec(str)); // null ['a', index: 1, input: 'qa', ...] null <=== test()에 영향 받음
var str = 'qa a';
var r = /a/;
console.log('21-test', r.test(str), r.test(str)); // true true
console.log('21-exec', r.exec(str), r.exec(str)); // ['a', index: 1, input: 'qa a', ...] ['a', index: 1, input: 'qa a', ...]
var r = /a/g; // g 플래그 사용
console.log('2g-test', r.test(str), r.test(str), r.test(str), r.test(str)); // true true false true <=== 여러 일치가 있으면 2번째 호출에서도 true
console.log('2g-exec', r.exec(str), r.exec(str), r.exec(str), r.exec(str)); // ['a', index: 3, input: 'qa a', ...] null ['a', index: 1, input: 'qa a', ...] ['a', index: 3, input: 'qa a', ...] <=== 2번째 호출에서 null
//-----------------------------------------------------------------------------
< 정규식 이용 함수 >
RegExp.prototype[@@match]() - g 플래그 사용시 모든 매칭 결과를 배열로 반환
console.log('qaqa'.match(/a/)); // ['a', index: 1, input: 'qaqa', ...] 처음 찾은 결과 위치 정보
console.log('qaqa'.match(/a/g)); // ['a', 'a'] 모든 결과값의 배열
RegExp.prototype[@@matchAll]() - g 플래그 없으면 에러
RegExp.prototype[@@search]() - g 와 상관없이 첫번째 찾은 위치 반환
RegExp.prototype[@@replace]() - g 없으면 1개만 변경
RegExp.prototype[@@split]() - 기본 g 있는 상태로 동작
//-----------------------------------------------------------------------------
< 참고 >
match() : g 플래그가 지정되면 모든 매칭 결과를 배열로 반환
search() : g 와 상관없이 첫번째 찾은 위치 반환
var str = 'qa';
var r = /a/;
console.log('11-search', str.search(r), str.search(r)); // 1 1
console.log('11-match', str.match(r), str.match(r)); // ['a', index: 1, input: 'qa', ...] ['a', index: 1, input: 'qa', ... ]
var r = /a/g; // g 플래그 사용
console.log('1g-search', str.search(r), str.search(r)); // 1 1
console.log('1g-match', str.match(r), str.match(r)); // ['a'] ['a']
var str = 'qa a';
var r = /a/;
console.log('21-search', str.search(r), str.search(r)); // 1 1
console.log('21-match', str.match(r), str.match(r)); // ['a', index: 1, input: 'qa a', ...] ['a', index: 1, input: 'qa a', ...]
var r = /a/g; // g 플래그 사용
console.log('2g-search', str.search(r), str.search(r)); // 1 1
console.log('2g-match', str.match(r), str.match(r)); // ['a', 'a'] ['a', 'a']