2017-09-28 1 views

답변

1

이는 첫 번째로 인해 \b입니다. \bword boundary은 문자열/개행 문자의 시작과 - 또는 + (즉, 단어가 아닌 문자) 사이에 일치하지 않습니다.

당신은 옵션 sign 그룹 후에 단어 경계를 이동해야합니다

(?<sign>[-+]?)\b(?<hours>2[1-3]|[01][0-9]|[1-9]):(?<minutes>[0-5][0-9])\b 
       ^^ 

regex demo를 참조하십시오.

이제 단어 경계 다음의 문자가 숫자 (단어 char)이므로 단어 경계가 제대로 작동하여 숫자 앞에 다른 단어 char가 오는 모든 일치가 실패합니다.

+0

감사합니다. 그것은 그것을 설명합니다. – paddyb

1

단어 경계 앵커 (\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도 비 라틴계 알파벳의 숫자와 일치합니다.

+0

감사합니다.좋은 팁이 있습니다. – paddyb

+1

@paddyb : 그냥'['\ d'가'[0-9]'와 같은 문자를 항상 매치하지는 않습니다 (https://stackoverflow.com/a/16621778/3832970). 파이썬 3에서 패턴을 사용하거나 PHP, Java, Python 2에서 유니 코드 수정자를 사용하면 또한 사실입니다. –

관련 문제