[01-12]
정규식 에서 범위 패턴을 사용하여 두 자리 mm를 일치 시키려고하는데 예상대로 작동하지 않습니다.
\d+
패턴을 사용하고 , 2.) 일치하는 문자열을 코드의 숫자로 변환합니다. 3.) 같은 숫자 범위를 확인하십시오 if(num >= 0 && num <= 12){ /*do something*/ }
. 훨씬 빠르고 유연합니다.
[01-12]
정규식 에서 범위 패턴을 사용하여 두 자리 mm를 일치 시키려고하는데 예상대로 작동하지 않습니다.
\d+
패턴을 사용하고 , 2.) 일치하는 문자열을 코드의 숫자로 변환합니다. 3.) 같은 숫자 범위를 확인하십시오 if(num >= 0 && num <= 12){ /*do something*/ }
. 훨씬 빠르고 유연합니다.
답변:
정규식에서 문자 클래스 정의가 작동하는 방식을 오해 한 것 같습니다.
문자열과 일치하는 01
, 02
, 03
, 04
, 05
, 06
, 07
, 08
, 09
, 10
, 11
, 또는 12
,이 작품과 같은 :
0[1-9]|1[0-2]
문자 클래스는 그 자체로 입력 문자열에서 정확히 하나의 문자를 찾으려고 시도 합니다. [01-12]
실제로 정의 [012]
, 3 개 문자의에 대한 입력에서 하나 개의 문자와 일치하는 문자 클래스 0
, 1
또는를 2
.
-
범위 정의에서 진행 1
을 1
단지 포함하는 1
. 한편, 무언가 같이 [1-9]
포함 1
, 2
, 3
, 4
, 5
, 6
, 7
, 8
, 9
.
초보자는 종종 [this|that]
. 이것은 "작동"하지 않습니다. 이 문자 정의를 정의는 [this|a]
, 그것이 6 개 임의의 문자에 대한 입력에서 하나 개의 문자와 일치 즉 t
, h
, i
, s
, |
또는 a
. (this|that)
의도 된 것 보다 더 많습니다 .
따라서 다음과 같은 패턴 between [24-48] hours
이 "작동"하지 않는 것이 분명 합니다. 이 경우 문자 클래스는 [248]
.
즉, -
문자 클래스 정의에서 패턴의 숫자 범위를 정의하지 않습니다. 정규식 엔진은 유한 반복 구문 (예 : a{3,5}
3과 5 사이의 일치)을 제외하고 패턴의 숫자를 실제로 "이해"하지 않습니다 a
.
범위 정의는 대신 문자의 ASCII / 유니 코드 인코딩을 사용하여 범위를 정의합니다. 문자 0
는 10 진수 48로 ASCII로 인코딩됩니다. 9
따라서 문자 정의 [0-9]
에는 인코딩에서 값이 10 진수 48에서 57 사이 인 모든 문자가 포함됩니다. 오히려 현명, 디자인이이 문자는 0
, 1
, ..., 9
.
또 다른 공통 문자 클래스 정의를 살펴 보겠습니다. [a-zA-Z]
ASCII에서 :
A
= 65, Z
= 90a
= 97, z
= 122이는 다음을 의미합니다.
[a-zA-Z]
그리고 [A-Za-z]
동등하다[a-Z]
잘못된 문자 범위 일 가능성이 높습니다.
a
(97)이 Z
(90) 보다 "보다 큼" 이기 때문입니다.[A-z]
합법적이지만 다음 6 개의 문자도 포함합니다.
[
(91), \
(92), ]
(93), ^
(94), _
(95), `
(96)0[1-9]|1[0-2]
작동하지 않습니다. 논리적 인 다음 단계로 변경하면 [1-9]|1[0-2]
이해할 수있는 이유 (그것은 일치를위한 중 하나가 작동하지 않습니다 1
에서만 10
, 11
그리고 12
). \b(?:[0-9]|1[0-1])\b
그것을 방지하기 위해 사용해야 했습니다. \b
's는 정규식이 단어 (또는이 경우 숫자) 경계 ( ^
& $
did n't) 와 일치하는지 확인합니다 . 대괄호는 또는 ( |
)를 다른면으로 간주합니다. 마지막으로 ?:
대괄호를 사용하여 부분 일치를 만들지 않는 것입니다.
"1,2,3,4,5,6,7,8,9,10,17,18".match(/^(([1-9]|1[0-7])\,?)+$/g )
이 JS 정규식이 17 이상인 이유를 말씀해 주시겠습니까?
[...]
구문으로 표시되는 정규식의 문자 클래스 는 입력 의 단일 문자 와 일치 하는 규칙을 지정합니다 . 따라서 대괄호 사이에 쓰는 모든 내용 은 단일 문자 를 일치 시키는 방법을 지정합니다 .
[01-12]
따라서 패턴 은 다음과 같이 분류됩니다.
따라서 기본적으로 일치하는 것은 0, 1 또는 2입니다.
원하는 일치를 수행하려면 01-12 범위의 두 자리 숫자를 숫자로 일치 시키려면 텍스트로 표시되는 방식에 대해 생각해야합니다.
당신은 :
그런 다음 다음과 같은 정규 표현식을 작성해야합니다.
+-- a 0 followed by 1-9
|
| +-- a 1 followed by 0-2
| |
<-+--> <-+-->
0[1-9]|1[0-2]
^
|
+-- vertical bar, this roughly means "OR" in this context
더 짧은 표현식을 얻기 위해 이들을 결합하려는 시도는 유효하지 않은 입력에 대해 거짓 긍정 일치를 제공하여 실패합니다.
예를 들어, 패턴 [0-1][0-9]
은 기본적으로 00-19 숫자와 일치하며 이는 원하는 것보다 약간 더 많습니다.
문자 클래스에 대한 자세한 정보를 얻을 수있는 확실한 소스를 찾으려고했지만 지금은이 Google Query for Regex Character Classes 만 드릴 수 있습니다 . 더 많은 정보를 찾을 수 있기를 바랍니다.
이것은 또한 작동합니다 :
^([1-9]|[0-1][0-2])$
[1-9]
1에서 9 사이의 단일 숫자와 일치
[0-1][0-2]
10에서 12 사이의 두 자리 숫자와 일치
여기에 좋은 예가 있습니다.
[0-1][0-2]
도 일치합니다 00
. 즉, 링크에 대한 +1 (내 답변에 사용).
[0-1][0-2]
이 문자열이 좋아하는 수주의 깊게 해석되어야한다 00
, 01
그리고 02
, 그러나 인정하지 않는 03
까지 09
, 마침내 인정 10
, 11
과 12
. 이에 대한 올바른 정규식은 [1-9]|1[0-2]
, 또는 짝수입니다 0*([1-9]|1[0-2])
(마지막으로 선행 0을 허용 함).
[]
정규식 의 s는 문자 클래스를 나타냅니다 . 범위를 지정하지 않으면 암시 적으로 또는 그 안의 모든 문자를 함께 사용합니다. 따라서, [abcde]
과 동일 (a|b|c|d|e)
는 아무것도 포착하지 않는 것을 제외하고; 이 중 하나와 일치합니다 a
, b
, c
, d
, 또는 e
. 범위가 나타내는 모든 것은 문자 집합입니다 . [ac-eg]
"다음 중 하나와 일치 : a
; c
과 사이의 모든 문자 e
; 또는 g
". 따라서, 귀하의 경기 중 하나를 일치 "말한다 0
; 모든 문자 사이 1
와 1
( 즉 , 단지 1
), 또는 2
.
당신의 목표는 숫자 범위를 지정 분명하다 : 임의의 숫자 사이 01
와 12
두 자리 숫자로 기록. 이 특정 경우에는 다음과 일치시킬 수 있습니다 0[1-9]|1[0-2]
. a 0
뒤에 1
와 사이의 숫자가 9
오거나 a 1
뒤에 0
와 사이의 숫자 가 나옵니다 2
. 일반적으로 비슷한 방식으로 모든 숫자 범위를 유효한 정규식으로 변환 할 수 있습니다. 그러나 정규식보다 더 나은 옵션이나 정규식을 구성 할 수있는 기존 함수 나 모듈이있을 수 있습니다. 언어에 따라 다릅니다.
polygenelubricants는 문자 클래스 ([]에있는 것)가 문자열이 아닌 문자와 일치하기 때문에 원하는 것보다 0 | 1-1 | 2를 찾을 것이라고 말합니다.
0|1-1|2
-이 표기법은 매우 오해의 소지가 있습니다. 같은 0|1|2
것이 더 정확할 것입니다.
[a-z0-9]