Development Tip

[01-12] 범위가 예상대로 작동하지 않는 이유는 무엇입니까?

yourdevel 2020. 10. 6. 19:31
반응형

[01-12] 범위가 예상대로 작동하지 않는 이유는 무엇입니까?


[01-12]정규식 에서 범위 패턴을 사용하여 두 자리 mm를 일치 시키려고하는데 예상대로 작동하지 않습니다.


정규식에서 문자 클래스 정의가 작동하는 방식을 오해 한 것 같습니다.

문자열과 일치하는 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.

-범위 정의에서 진행 11단지 포함하는 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에서 Z

또 다른 일반적인 문자 클래스 정의를 살펴 보겠습니다. [a-zA-Z]

ASCII에서 :

  • A= 65, Z= 90
  • a= 97, z= 122

이는 다음을 의미합니다.

  • [a-zA-Z]그리고 [A-Za-z]동등하다
  • 대부분의 풍미에서 [a-Z]잘못된 문자 범위 일 가능성이 높습니다.
    • a(97)이 Z(90) 보다 "보다 큼" 이기 때문입니다.
  • [A-z] 합법적이지만 다음 6 개의 문자도 포함합니다.
    • [(91), \(92), ](93), ^(94), _(95), `(96)

관련 질문


[...]구문으로 표시되는 정규식의 문자 클래스 는 입력 의 단일 문자 와 일치 하는 규칙을 지정합니다 . 따라서 대괄호 사이에 쓰는 모든 내용 은 단일 문자 를 일치 시키는 방법을 지정합니다 .

[01-12]따라서 패턴 은 다음과 같이 분류됩니다.

  • 0-단일 숫자 0과 일치
  • 또는 1-1, 1에서 1까지의 범위에있는 단일 숫자와 일치
  • 또는 2, 단일 숫자 2와 일치

따라서 기본적으로 일치하는 것은 0, 1 또는 2입니다.

원하는 일치를 수행하려면 01-12 범위의 두 자리 숫자를 숫자로 일치 시키려면 텍스트로 표시되는 방식에 대해 생각해야합니다.

당신은 :

  • 01-09 (즉, 첫 번째 숫자는 0, 두 번째 숫자는 1-9)
  • 10-12 (즉, 첫 번째 숫자는 1, 두 번째 숫자는 0-2)

그런 다음 다음과 같은 정규 표현식을 작성해야합니다.

  +-- 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 숫자와 일치하며 이는 원하는 것보다 약간 더 많습니다.

I tried finding a definite source for more information about character classes, but for now all I can give you is this Google Query for Regex Character Classes. Hopefully you'll be able to find some more information there to help you.


This also works:

^([1-9]|[0-1][0-2])$

[1-9] matches single digits between 1 and 9

[0-1][0-2] matches double digits between 10 and 12

There are some good examples here


The []s in a regex denote a character class. If no ranges are specified, it implicitly ors every character within it together. Thus, [abcde] is the same as (a|b|c|d|e), except that it doesn't capture anything; it will match any one of a, b, c, d, or e. All a range indicates is a set of characters; [ac-eg] says "match any one of: a; any character between c and e; or g". Thus, your match says "match any one of: 0; any character between 1 and 1 (i.e., just 1); or 2.

Your goal is evidently to specify a number range: any number between 01 and 12 written with two digits. In this specific case, you can match it with 0[1-9]|1[0-2]: either a 0 followed by any digit between 1 and 9, or a 1 followed by any digit between 0 and 2. In general, you can transform any number range into a valid regex in a similar manner. There may be a better option than regular expressions, however, or an existing function or module which can construct the regex for you. It depends on your language.


As polygenelubricants says yours would look for 0|1-1|2 rather than what you wish for, due to the fact that character classes (things in []) match characters rather than strings.


Use this:

0?[1-9]|1[012]
  • 07: valid
  • 7: valid
  • 0: not match
  • 00 : not match
  • 13 : not match
  • 21 : not match

To test a pattern as 07/2018 use this:

/^(0?[1-9]|1[012])\/([2-9][0-9]{3})$/

(Date range between 01/2000 to 12/9999 )

참고URL : https://stackoverflow.com/questions/3148240/why-doesnt-01-12-range-work-as-expected

반응형