[java] 정규식은 정확히 n 번 또는 m 번

다음과 같은 정규 표현식, 고려 X입니다 어떤 정규식.

X{n}|X{m}

이 정규식은 정확히 또는 시간이 X발생 하는지 테스트합니다 . nm

발생을 X정확히 n또는 m시간 테스트 할 수있는 정규식 한정자가 있습니까?



답변

“정확히 m 또는 n 번”을 의미하는 단일 수량자는 없습니다. 당신이하는 방식은 괜찮습니다.

대안은 다음과 같습니다.

X{m}(X{k})?

여기서 m < nand k는의 값입니다 n-m.


답변

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

  • ?, ??-0 또는 1 회 발생 ( ??게으르고 ?탐욕 스러움)
  • *, *?-횟수 제한 없음
  • +, +?-하나 이상의 발생
  • {n}-정확히 n발생
  • {n,m}nm발행 수, 포함
  • {n,m}?nm발행 수, 게으른
  • {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]|$)

“xn 시간”또는 “xm 시간”을 원하는 것 같습니다. 정규식에 대한 문자 그대로 번역은 다음 (x{n}|x{m}).
과 같습니다. https://regex101.com/r/vH7yL5/1

또는 m 개 이상의 “x”시퀀스를 가질 수있는 경우 (m> n이라고 가정) ‘following no “x”‘및 ‘following no “x”를 추가하여로 번역 할 [^x](x{n}|x{m})[^x]수 있습니다. “x”뒤에 항상 문자가 있다고 가정합니다. 여기에서 볼 수 있듯이 https://regex101.com/r/bB2vH2/1

(?:[^x]|^)(x{n}|x{m})(?:[^x]|$)“뒤에 ‘x’또는 다음 줄 시작”및 “뒤에 ‘x’없음 또는 뒤에 줄 끝”으로 변환하여로 변경할 수 있습니다 . 그러나 여전히 두 시퀀스 사이에 하나의 문자 만있는 두 시퀀스는 일치하지 않습니다 (첫 번째 일치에는 다음 문자가 필요하고 두 번째 일치는 이전 문자가 필요하기 때문). https://regex101.com/r/ oC5oJ4 / 1

마지막으로, 한 문자 먼 일치를 일치시키기 위해 “no ‘x’after”에 긍정적 인 룩 (? =)을 추가하거나 “no ‘x’before”에 긍정적 인 룩 (? <=)을 추가 할 수 있습니다. 다음과 같이 : https://regex101.com/r/mC4uX3/1

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

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


답변

Enhardened의 답변을 살펴보면 두 번째 표현은 시퀀스 사이에 문자가 하나만있는 시퀀스와 일치하지 않을 것이라고 말합니다. 미리보기 / 뒤로보기를 사용하지 않고이 문제를 쉽게 수정할 수있는 방법이 있습니다. 시작 / 끝 문자를 경계 문자로 바꾸는 것입니다. 이렇게하면 시작 / 끝을 포함하는 단어 경계와 일치시킬 수 있습니다. 따라서 적절한 표현식은 다음과 같아야합니다.

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

여기에서 볼 수 있듯이 https://regex101.com/r/oC5oJ4/2 .


답변

아주 오래된 게시물이지만 도움이 될 수있는 sth를 기여하고 싶습니다. 나는 질문에 명시된 방식으로 정확하게 시도했지만 작동하지만 문제가 있습니다. 수량의 순서가 중요합니다. 이걸 고려하세요:

#[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 패턴에 깊이 빠져있는 것은 아닙니다.


답변