정규식에서 대괄호와 괄호의 차이점은 무엇입니까?
다음은 JavaScript에서 사용하기 위해 만든 정규식입니다.
var reg_num = /^(7|8|9)\d{9}$/
다음은 팀원이 제안한 또 다른 것입니다.
var reg_num = /^[7|8|9][\d]{9}$/
규칙은 전화 번호를 확인하는 것입니다.
- 10 개의 숫자 여야합니다.
- 첫 번째 숫자는 7, 8 또는 9입니다.
다음 정규식은 동일합니다 (일치 목적을 위해).
/^(7|8|9)\d{9}$/
/^[789]\d{9}$/
/^[7-9]\d{9}$/
설명:
(a|b|c)
은 정규식 "OR"이며 "a 또는 b 또는 c"를 의미합니다. OR에 필요한 대괄호가 있으면 숫자 도 캡처 됩니다. 엄격히 동일하게하려면 비 캡처 그룹(?:7|8|9)
으로 만들도록 코딩 해야합니다 .[abc]
는 "a, b 또는 c의 모든 문자"를 의미하는 "문자 클래스"입니다 (문자 클래스는 범위를 사용할 수 있습니다 (예 :[a-d]
=[abcd]
).)
이러한 정규식이 유사한 이유는 문자 클래스가 "or"(단일 문자에만 해당)의 속기이기 때문입니다. 교대 (abc|def)
로 문자 클래스로 변환되지 않는 것과 같은 작업을 수행 할 수도 있습니다 .
그가 저지른 실수를 제외하고 는 당신 팀의 조언은 거의 옳습니다. 그 이유를 알게되면 절대 잊지 못할 것입니다. 이 실수를보세요.
/^(7|8|9)\d{9}$/
이것이하는 일 :
^
그리고$
이러한 앵커 사이의 서브 패턴이 전체 일치하는 것을 주장하는 고정 된 일치를 의미한다. 문자열은 하위 패턴이 섹션뿐만 아니라 전체와 일치하는 경우에만 일치합니다.()
캡처 그룹을 나타냅니다 .7|8|9
중 하나와 일치하는 의미7
,8
또는9
. 또한 이것을 수행 교대 파이프 조작자가 무엇 인|
번갈아 교대 사이 - 않는다. 이것은 교대 사이를 역 추적합니다. 첫 번째 교대가 일치하지 않으면 엔진은 교대 일치 중에 포인터 위치가 이동하기 전에 돌아와 다음 교대를 계속 일치시켜야합니다. 캐릭터 클래스는 순차적으로 진행할 수 있습니다 . 최적화가 비활성화 된 정규식 엔진에서이 일치를 확인하십시오.
Pattern: (r|f)at
Match string: carat
Pattern: [rf]at
Match string: carat
\d{9}
9 자리 숫자와 일치합니다.\d
임의의 숫자와 일치하는 속기 메타 문자입니다.
/^[7|8|9][\d]{9}$/
그것이 무엇을하는지보십시오 :
^
및$
뿐만 아니라 고정 된 일치를 의미한다.[7|8|9]
is a character class. Any characters from the list7
,|
,8
,|
, or9
can be matched, thus the|
was added in incorrectly. This matches without backtracking.[\d]
is a character class that inhabits the metacharacter\d
. The combination of the use of a character class and a single metacharacter is a bad idea, by the way, since the layer of abstraction can slow down the match, but this is only an implementation detail and only applies to a few of regex implementations. JavaScript is not one, but it does make the subpattern slightly longer.{9}
indicates the previous single construct is repeated nine times in total.
The optimal regex is /^[789]\d{9}$/
, because /^(7|8|9)\d{9}$/
captures unnecessarily which imposes a performance decrease on most regex implementations (javascript happens to be one, considering the question uses keyword var
in code, this probably is JavaScript). The use of php which runs on PCRE for preg matching will optimize away the lack of backtracking, however we're not in PHP either, so using classes []
instead of alternations |
gives performance bonus as the match does not backtrack, and therefore both matches and fails faster than using your previous regular expression.
The first 2 examples act very differently if you are REPLACING them by something. If you match on this:
str = str.replace(/^(7|8|9)/ig,'');
you would replace 7 or 8 or 9 by the empty string.
If you match on this
str = str.replace(/^[7|8|9]/ig,'');
당신은 7
또는 8
또는 9
또는 수직 막대를 교체 할 것입니다 !!!! 빈 문자열로.
나는 이것을 어려운 방법으로 발견했습니다.
'developer tip' 카테고리의 다른 글
.vimrc 파일에서 어떤 것을 "소싱"하려면 어떻게합니까? (0) | 2020.08.30 |
---|---|
SQL Server 2005에서 SQL 쿼리를 사용하여 테이블의 열 순서를 변경하는 방법은 무엇입니까? (0) | 2020.08.30 |
__init__.py 파일에 대한 번역을 저장할 로케일 경로를 찾을 수 없습니다. (0) | 2020.08.30 |
항상 IEnumerable을 반환해야합니까? (0) | 2020.08.30 |
파이썬에서 복소수 사용 (0) | 2020.08.30 |