정규식의 일부와 일치하지만 캡처하지 않는 방법은 무엇입니까?
문자열 목록이 있습니다. 그들 중 일부는 형태
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에 있음을 기억하십시오
시험:
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
'programing' 카테고리의 다른 글
REST Complex / Composite / Nested Resources [폐쇄] (0) | 2020.05.25 |
---|---|
Android에서 OpenGL-ES 게임을위한 튜토리얼 및 라이브러리 (0) | 2020.05.25 |
양방향 암호화 : 검색 할 수있는 비밀번호를 저장해야합니다 (0) | 2020.05.24 |
C 멀티 라인 매크로 : do / while (0) vs scope block [duplicate] (0) | 2020.05.24 |
git이 실제로 병합하지 않고 병합이 충돌하는지 알려줄 수 있습니까? (0) | 2020.05.24 |