programing

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

new-time 2020. 5. 24. 22:27
반응형

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


문자열 목록이 있습니다. 그들 중 일부는 형태

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}/

지금까지 가장 간단한 방법은 (python에서 작동)입니다

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

.참고 URL :

https://stackoverflow.com/questions/3926451/how-to-match-but-not-capture-part-of-a-regex

반응형