음수 시간 오프셋을 포착하기 위해 다음과 같은 정규 표현식을 사용했습니다 : &.특수 문자가 정규식 그룹에서 캡처되지 않는 이유
\b(?<sign>[\-\+]?)(?<hours>2[1-3]|[01][0-9]|[1-9]):(?<minutes>[0-5]\d)\b
잘 일치하지만 캡처 그룹에는 선행 부호가 표시되지 않습니다. 내가 잘못 포맷합니까? 여기에서 효과를 볼 수 있습니다 https://regex101.com/r/CQxL8q/1/
음수 시간 오프셋을 포착하기 위해 다음과 같은 정규 표현식을 사용했습니다 : &.특수 문자가 정규식 그룹에서 캡처되지 않는 이유
\b(?<sign>[\-\+]?)(?<hours>2[1-3]|[01][0-9]|[1-9]):(?<minutes>[0-5]\d)\b
잘 일치하지만 캡처 그룹에는 선행 부호가 표시되지 않습니다. 내가 잘못 포맷합니까? 여기에서 효과를 볼 수 있습니다 https://regex101.com/r/CQxL8q/1/
이는 첫 번째로 인해 \b
입니다. \b
word boundary은 문자열/개행 문자의 시작과 -
또는 +
(즉, 단어가 아닌 문자) 사이에 일치하지 않습니다.
당신은 옵션 sign
그룹 후에 단어 경계를 이동해야합니다
(?<sign>[-+]?)\b(?<hours>2[1-3]|[01][0-9]|[1-9]):(?<minutes>[0-5][0-9])\b
^^
가 regex demo를 참조하십시오.
이제 단어 경계 다음의 문자가 숫자 (단어 char)이므로 단어 경계가 제대로 작동하여 숫자 앞에 다른 단어 char가 오는 모든 일치가 실패합니다.
단어 경계 앵커 (\b
)는 단어 문자 (문자, 숫자 또는 밑줄)와 단어가 아닌 문자 간의 전환 또는 그 반대의 전환을 의미합니다. -13:21
에는 이러한 전환이 없습니다.
단어 경계 앵커는 시간 (65401:23
)과 비슷한 표현에서 일치시키지 않으려면 부호와 시간 사이에 머물 수 있지만 654:01:23
또는 과 일치하지 않도록 할 수는 없습니다.
보조 노트로 [\-\+]
은 단지 회선 방식으로 [-+]
을 작성하는 것입니다. +
은 문자 클래스 내에서 특별한 의미가 없으므로 이스케이프 할 필요가 없습니다. -
은 문자 클래스 내 특수 문자이지만 첫 번째 문자 또는 마지막 문자 (예 : [-
또는 -]
)는 아닙니다.
[0-9]
과 \d
을 모두 regex
에 사용합니다. 그들은 동일한 것을 나타냅니다 가독성을 위해 하나의 규칙 만 고집하는 것이 좋습니다. 숫자 만 들어있는 다른 문자 클래스가 사용되었으므로 [0-9]
이 아닌 \d
을 사용합니다.
그리고 시간에 대한 정규식 조각에 몇 가지 버그
:2[1-3]|[01][0-9]|[1-9]
는
0
일치하지 않습니다 (하지만
00
일치) 및
20
을.
주어 모든 상기 수정 및 개선은 regex
는 같아야 유니 플래그가 설정되지 않은 경우
(?<sign>[-+]?)\b(?<hours>2[0-3]|[01][0-9]|[0-9]):(?<minutes>[0-5][0-9])\b
1\d
[0-9]
는 것과 동일하다. 유니 코드를 사용하면 \d
도 비 라틴계 알파벳의 숫자와 일치합니다.
감사합니다.좋은 팁이 있습니다. – paddyb
@paddyb : 그냥'['\ d'가'[0-9]'와 같은 문자를 항상 매치하지는 않습니다 (https://stackoverflow.com/a/16621778/3832970). 파이썬 3에서 패턴을 사용하거나 PHP, Java, Python 2에서 유니 코드 수정자를 사용하면 또한 사실입니다. –
감사합니다. 그것은 그것을 설명합니다. – paddyb