[regex] 정규식의 일부와 일치하지만 캡처하지 않는 방법은 무엇입니까?

문자열 목록이 있습니다. 그들 중 일부는 형태 123-...456입니다. 변수 부분 “…”은 다음과 같습니다.

  • 문자열 “apple”다음에 하이픈 (예 : 하이픈) 123-apple-456
  • 문자열 “banana”뒤에 하이픈 (예 : 하이픈) 123-banana-456
  • 빈 문자열 (예 : 123-456하나의 하이픈 만 있음)

“apple”또는 “banana”이외의 단어는 유효하지 않습니다.

이 세 가지 경우 각각 “apple”, “banana”및 “”와 일치 시키려고합니다. 하이픈을 캡처 하고 싶지 는 않지만 항상 일치 시키고 싶습니다 . 문자열이 123-...456위에서 설명한 형식이 아닌 경우 전혀 일치하지 않습니다.

이를 위해 정규식을 어떻게 작성합니까? 미리보기, 뒤로보기, 둘러보기 및 비 캡처 그룹을 허용하는 맛이 있다고 가정합니다.


여기서 중요한 점은 “사과”또는 “바나나” 가있는 경우 끝에 하이픈이 있어야 하지만 일치하지는 않는 것입니다. 빈 문자열을 일치시킬 때 뒤에 하이픈이 없어야합니다 . 이 주장을 캡슐화하는 정규식이 올바른 것이라고 생각합니다.



답변

무언가를 캡처하지 않는 유일한 방법은 둘러보기 어설 션을 사용하는 것입니다 .

(?<=123-)((apple|banana)(?=-456)|(?=456))

캡처하지 않은 그룹(?:…) 의 경우에도 정규 표현식 전체가 일치하는 내용을 캡처합니다. 그러나이 정규 표현식은 일치 apple또는 banana이 앞에있어 경우 123-와 다음 -456, 또는이 앞에있어 경우는 빈 문자열과 일치 123-하고 다음에 456.

|Lookaround  |    Name      |        What it Does                       |
-----------------------------------------------------------------------
|(?=foo)     |   Lookahead  | Asserts that what immediately FOLLOWS the |
|            |              |  current position in the string is foo    |
-------------------------------------------------------------------------
|(?<=foo)    |   Lookbehind | Asserts that what immediately PRECEDES the|
|            |              |  current position in the string is foo    |
-------------------------------------------------------------------------
|(?!foo)     |   Negative   | Asserts that what immediately FOLLOWS the |
|            |   Lookahead  |  current position in the string is NOT foo|
-------------------------------------------------------------------------
|(?<!foo)    |   Negative   | Asserts that what immediately PRECEDES the|
|            |   Lookbehind |  current position in the string is NOT foo|
-------------------------------------------------------------------------


답변

업데이트 : Germán Rodríguez Herrera에게 감사합니다!

자바 스크립트에서 시도하십시오 : /123-(apple(?=-)|banana(?=-)|(?!-))-?456/

결과는 그룹 1에 있음을 기억하십시오

Debuggex 데모


답변

시험:

123-(?:(apple|banana|)-|)456

, 또는 빈 문자열 과 일치 apple하며 그 banana뒤에 0 또는 1 개의 하이픈이 있습니다. 나는 캡처 그룹이 필요하지 않은 것에 대해 틀렸다. 바보 나.


답변

답변 중 하나를 수정했습니다 (@ op1ekun에 의해).

123-(apple(?=-)|banana(?=-)|(?!-))-?456

그 이유는 @ op1ekun의 답변도 "123-apple456"사과 뒤에 하이픈없이 일치하기 때문 입니다.


답변

이 시도:

/\d{3}-(?:(apple|banana)-)?\d{3}/


답변

\K일치에 숫자 블록이 포함되지 않도록 일치 위치를 재설정 하는 데 사용되는 @Gumbo의 변형 표현 입니다. PCRE 정규식 맛에 사용할 수 있습니다.

123-\K(?:(?:apple|banana)(?=-456)|456\K)

성냥:

Match 1  apple
Match 2  banana
Match 3


답변

지금까지 가장 간단한 방법은 (python에서 작동)입니다 '123-(apple|banana)-?456'.