programing

regex는 정확히 n OR m 회

randomtip 2023. 1. 15. 12:50
반응형

regex는 정확히 n OR m 회

다음 정규 표현을 고려합니다.X모든 정규식입니다.

X{n}|X{m}

이 정규식은 다음을 테스트합니다.X정확하게 발생하고 있다 n또는m시대.

발생을 테스트할 수 있는 정규식 계량자가 있습니까?X정확하게n또는m몇 번이나요?

"정확히 m회 또는 n회"를 의미하는 단일 수량자는 없습니다.네가 하는 방식은 괜찮다.

다른 방법은 다음과 같습니다.

X{m}(X{k})?

어디에m < n그리고.k의 가치입니다.n-m.

다음은 수량자 전체 목록입니다(참조 자료: http://www.regular-expressions.info/reference.html):

  • ?,??(0 또는 1 발생).??게을러서?욕심이 많다)
  • *,*?- 발생 횟수 제한 없음
  • +,+?- 1개 이상 발생
  • {n}- 정확합니다.n발생하다
  • {n,m}-n로.m발생(포함)
  • {n,m}?-n로.m발생, 게으름
  • {n,},{n,}?(적어도)n발생하다

"정확한 N 또는 M"을 얻으려면 m, n이 특별한 경우를 제외하고 정량화된 정규식을 두 번 써야 합니다.

  • X{n,m}한다면m = n+1
  • (?:X{n}){1,2}한다면m = 2n
  • ...

아니요, 그런 수식자는 없습니다.하지만 나는 그것을 재구성하고 싶다./X{m}(X{m-n})?/역추적 문제를 방지합니다.

TLDR;(?<=[^x]|^)(x{n}|x{m})(?:[^x]|$)

"x n times" 또는 "x m times"를 원하는 것처럼 보이는데, regex에 대한 문자 그대로의 번역은(x{n}|x{m}).다음과 같이 https://regex101.com/r/vH7yL5/1

또는 m "x"s 이상의 시퀀스를 가질 수 있는 경우(param m > n), "param no "x" 및 "param no "x"를 추가하여 다음과 같이 변환할 수 있습니다.[^x](x{n}|x{m})[^x]'x'의 앞뒤에는 항상 캐릭터가 있다고 가정합니다.여기 보시는 바와 같이 https://regex101.com/r/bB2vH2/1

로 변경할 수 있습니다.(?:[^x]|^)(x{n}|x{m})(?:[^x]|$)'x' 또는 'following line start' 및 'x' 또는 'following line end'로 변환됩니다.단, https://regex101.com/r/oC5oJ4/1에서 볼 수 있듯이 두 시퀀스 사이에 하나의 문자만 있는 두 시퀀스는 일치하지 않습니다(첫 번째 일치에는 다음 문자가 필요하고 두 번째 일치에는 이전 문자가 필요하기 때문입니다).

마지막으로, 한 글자 거리 일치와 일치시키려면 다음과 같이 "no 'x' after"에 긍정적인 시선(?=)을 추가하거나 "no 'before' before"에 긍정적인 시선(?<=)을 추가할 수 있습니다. https://regex101.com/r/mC4uX3/1

(?<=[^x]|^)(x{n}|x{m})(?:[^x]|$)

이렇게 하면 원하는 'x'의 정확한 숫자만 일치시킬 수 있습니다.

아주 오래된 글이지만 도움이 될 만한 글을 쓰고 싶습니다.질문에 기재된 대로 시험해 보았습니다만, 효과가 있었습니다만, 단점이 있습니다.수량의 순서가 중요합니다.다음 사항을 고려하십시오.

#[a-f0-9]{6}|#[a-f0-9]{3}

이렇게 하면 발생하는 모든 16진수 색상 코드(3자리 또는 6자리 길이)를 찾을 수 있습니다.근데 이렇게 뒤집으면

#[a-f0-9]{3}|#[a-f0-9]{6}

3자리 숫자 또는 6자리 숫자 중 처음 3자리 숫자만 찾습니다.이것은 일리가 있고 Regex 프로는 이것을 즉시 발견할 수 있지만, 많은 사람들에게 이것은 특이한 행동일 수 있습니다.순서에 관계없이 이 트랩을 회피할 수 있는 고도의 Regex 기능이 몇 가지 있습니다만, 모든 사람이 Regex 패턴에 정통한 것은 아닙니다.

Enhardened의 답변을 보면, 그들은 그들의 두 번째 표현이 단지 한 글자 사이에 있는 시퀀스와 일치하지 않을 것이라고 말한다.이것을 수정하는 간단한 방법이 있습니다.그것은 시작/종료 문자를 경계 문자로 대체하는 것입니다.이를 통해 시작/끝을 포함하는 단어 경계와 일치시킬 수 있습니다.따라서 적절한 표현은 다음과 같습니다.

(?:[^x]|\b)(x{n}|x{m})(?:[^x]|\b)

여기 보시는 바와 같이 https://regex101.com/r/oC5oJ4/2 입니다.

언급URL : https://stackoverflow.com/questions/13874777/regex-exactly-n-or-m-times

반응형