programing

정규 표현식에서 'g' 깃발의 의미는 무엇입니까?

lastcode 2023. 10. 19. 22:21
반응형

정규 표현식에서 'g' 깃발의 의미는 무엇입니까?

그것의 의미는 무엇입니까?g정규 표현으로 된 깃발?

어떤 점이 다른가요?/.+/g그리고./.+/?

g전세계 검색을 위한 것입니다.모든 상황과 일치한다는 뜻입니다.여러분도 보통 보게 될 것입니다.i그 말은 사건을 무시한다는 뜻입니다.

참조 : 글로벌 - 자바스크립트 | MDN

"g" 플래그는 문자열에서 가능한 모든 일치 항목에 대해 정규식을 테스트해야 함을 나타냅니다.

없는.g플래그, 첫번째 테스트만 할 겁니다.

추가적으로, 그것이 어떻게 설정하는지에 대한 자세한 사항은 아래의 chamberlain의 답변을 반드시 확인하세요.lastIndex일련의 값에 대해 regex를 다시 사용할 때 예기치 않은 부작용을 초래할 수 있는 property.

자바스크립트로 설명하기 위한 예제:

> 'aaa'.match(/a/g)
[ 'a', 'a', 'a' ]

> 'aaa'.match(/a/)
[ 'a', index: 0, input: 'aaa' ]

@matiska 가 지적했듯이,g플래그가 설정합니다.lastIndex재산도 마찬가지입니다.

이것의 매우 중요한 부작용은 일치하는 문자열에 대해 동일한 regex 인스턴스를 재사용하는 경우 검색을 시작하기 때문에 결국 실패한다는 것입니다.lastIndex.

// regular regex
const regex = /foo/;

// same regex with global flag
const regexG = /foo/g;

const str = " foo foo foo ";

const test = (r) => console.log(
    r,
    r.lastIndex,
    r.test(str),
    r.lastIndex
);

// Test the normal one 4 times (success)
test(regex);
test(regex);
test(regex);
test(regex);

// Test the global one 4 times
// (3 passes and a fail)
test(regexG);
test(regexG);
test(regexG);
test(regexG);

g는 글로벌 검색 플래그입니다.

글로벌 검색 플래그는 RegExp가 문자열 전체에서 패턴을 검색하여 주어진 패턴과 일치하는 모든 발생 항목의 배열을 만듭니다.

그래서 그 차이는/.+/g그리고./.+/그것은gversion은 첫번째가 아닌 모든 상황을 찾아낼 것입니다.

사이에 차이가 없습니다./.+/g그리고./.+/왜냐하면 그들 둘 다 오직 한 번만 전체 끈과 일치할 것이기 때문입니다.g정규식이 두 번 이상 일치할 수 있거나 그룹을 포함할 수 있는 경우(이 경우) 차이가 발생합니다..match()는 그룹 배열 대신 일치하는 배열을 반환합니다.

  1. g ->모든 일치 항목을 반환합니다.
  2. without g ->첫번째 일치를 반환합니다.

예:

  1. '1 2 1 5 6 7'.match(/\d+/)돌아온다["1", index: 0, input: "1 2 1 5 6 7", groups: undefined]. 보시다시피 저희는 첫 경기만 할 수 있습니다."1".
  2. '1 2 1 5 6 7'.match(/\d+/g)모든 일치 항목의 배열을 반환합니다.["1", "2", "1", "5", "6", "7"].

이미 언급된 것 외에g깃발, 그것은 영향을 줍니다.regexp.lastIndex속성:

lastIndex는 다음 일치를 시작할 인덱스를 지정하는 정규식 인스턴스의 읽기/쓰기 정수 속성입니다. (...) 이 속성은 정규식 인스턴스가 전역 검색을 나타내기 위해 "g" 플래그를 사용한 경우에만 설정됩니다.

참조: 모질라 개발자 네트워크

정규식에서 G는 전역 검색을 정의하는 것으로, 모든 행에서 모든 인스턴스를 검색하는 것을 의미합니다.

문자열을 기준으로 예를 들어보겠습니다.문자열에서 모든 발생을 제거하려면."hello world"에서 ""와 함께 "o"의 모든 출현을 제거하고 싶다면 다음과 같이 합시다.

"hello world".replace(/o/g,'');

제 경우에는 첫 글자부터 매번 문자열을 재평가해야 하는 문제가 있습니다. 왜냐하면 이 문제를 제거해야 합니다./my_regexp/g(global flag) lastIndex 이동을 중지합니다.

mdn에 언급된 바와 같이:

글로벌 (g) 플래그가 설정되어 있는지 확인하십시오. 그렇지 않으면 lastIndex가 더 이상 고급화되지 않습니다.https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec#specifications

아마도 당신들 중 일부는 당신의 regex 인스턴스가 그것과 함께 설정되어 있기 때문에 여기에 있을 것입니다.g플래그가 실패했습니다.

다음은 예입니다.문자 "a"를 포함하는 배열에서 모든 문자열을 찾으려는 경우.

const array = ["today", "cat", "dog", "rabbit"]
const reg = new RegExp("a", "g")
const matchedArray = array.filter(v => {
  const matched = reg.test(v)
  console.log(`String "${v}", matched: ${matched}`)
})

당신은 그 끈들을 발견할 것입니다.rabit그리고.today시험에 합격했지만,cat안 그래요.

그 이유는 매칭을 한 후에today성공적으로.lastIndex됩니다.today문자열, 즉 4입니다.

그런 다음 regex 인스턴스가cat. 왜냐면 없어요.a인덱스 4의 문자, 테스트 실패, 그리고lastIndex0으로 설정됩니다.

다음 분.dog테스트에 실패하고.lastIndex다시 0으로 설정됩니다.그리고나서rabbit인덱스 0부터 시작하여 테스트됩니다.지나가요.

그래서 결론은 다음과 같습니다. 추가할 경우 주의해야 합니다.g플래그를 당신의 regex 인스턴스에 보내고 당신은 그것을 다음과 같이 부르려고 합니다.exec아니면test여러 번

언급URL : https://stackoverflow.com/questions/12993629/what-is-the-meaning-of-the-g-flag-in-regular-expressions

반응형