RegEx: 정규식을 마스터하기 위한 20가지 간단한 단계. Part 1 원본은 여기에 있습니다. 마지막 부분에서 우리는 가장 간단한 정규식을 마스터했고 이미 뭔가를 배웠습니다. 이 부분에서는 좀 더 복잡한 디자인을 공부할 것입니다. 하지만 생각만큼 어렵지는 않을 것입니다. 그럼 계속하자!
8단계: 별표
지금까지 우리는 주어진 길이의 문자열만 일치시킬 수 있었습니다. 하지만 최근 문제에서는 지금까지 본 표기법으로 할 수 있는 작업의 한계에 도달했습니다. 예를 들어, 3자 Java 식별자로 제한되지 않고 길이에 관계없이 식별자를 가질 수 있다고 가정해 보겠습니다. 이전 예에서는 효과가 있었던 솔루션이 다음 예에서는 작동하지 않습니다.
9단계: '선택적' 물음표
마지막 문제를 해결하기 위해 이미 정규식을 작성하셨나요? 효과가 있었나요? 이제 여기에 적용해 보세요.
10단계: "또는" 기호
8단계에서는 다양한 유형의 부동 소수점 숫자를 찾는 데 어려움을 겪었습니다.
8단계: 별표 *
및 더하기 기호+
지금까지 우리는 주어진 길이의 문자열만 일치시킬 수 있었습니다. 하지만 최근 문제에서는 지금까지 본 표기법으로 할 수 있는 작업의 한계에 도달했습니다. 예를 들어, 3자 Java 식별자로 제한되지 않고 길이에 관계없이 식별자를 가질 수 있다고 가정해 보겠습니다. 이전 예에서는 효과가 있었던 솔루션이 다음 예에서는 작동하지 않습니다.
패턴: [a-zA-Z_$]\w\w 문자열: __e $12 3 3.2 fo Bar r a23 mm ab x 일치 항목: ^^^ ^^^ ^^^ ^^^( 예 ) 메모식별자가 유효하지만 3자를 초과하는 경우 처음 3자만 일치합니다. 그리고 식별자가 유효하지만 3자 미만을 포함하면 정규식은 이를 전혀 찾지 못합니다! 문제는 괄호로 묶인 표현식이 와
[]
같은 문자 클래스와 마찬가지로 정확히 하나의 문자와 일치한다는 것입니다 \w
. 이는 위의 정규식에서 일치하는 항목의 길이가 정확히 3자여야 함을 의미합니다. 그래서 우리가 기대했던 것만큼 잘 작동하지 않습니다. *
특수 문자 및 가 여기에서 도움이 될 수 있습니다 +
. 이는 해당 표현식을 두 번 이상 일치시키기 위해 표현식의 오른쪽에 추가할 수 있는 수정자입니다. Kleene Star(또는 "별표")는 *
이전 토큰이 0번을 포함하여 여러 번 일치해야 함을 나타냅니다. 더하기 기호는 +
한 번 이상 검색해야 함을 나타냅니다. 따라서 앞에 오는 표현식은 +
필수(최소 한 번)이고, 앞에 오는 표현식은 *
선택사항이지만 나타날 때는 여러 번 나타날 수 있습니다. 이제 이러한 지식을 바탕으로 위의 정규식을 수정할 수 있습니다.
패턴: [a-zA-Z_$]\w* 문자열: __e $123 3.2 fo Barr a23mm ab x 일치: ^^^ ^^^^ ^^ ^^^^ ^^^^^ ^^ ^( 예 ) 이제 모든 길이의 유효한 식별자를 일치시킵니다! 빙고!
+
하지만 ? 대신 ? 를 사용하면 어떻게 될까요 *
?
패턴: [a-zA-Z_$]\w+ 문자열: __e $123 3.2 fo Barr a23mm ab x 일치 항목: ^^^ ^^^^ ^^ ^^^^ ^^^^^ ^^( 예 ) 마지막 경기를 놓쳤습니다
х
. +
일치하려면 최소한 하나의 문자가 필요 하지만 []
앞 의 괄호 안에 있는 표현식 \w+
이 이미 해당 문자를 '먹었기' 때문에 x
더 이상 사용할 수 있는 문자가 없으므로 일치가 실패하기 때문입니다. 언제 사용할 수 있나요 +
? 최소한 하나의 일치 항목을 찾아야 하지만 주어진 표현식이 몇 번이나 일치해야 하는지는 중요하지 않습니다. 예를 들어, 소수점이 포함된 숫자를 찾으려면 다음과 같이 하세요.
패턴: \d*\.\d+ 문자열: 0.011 .2 42 2.0 3.33 4.000 5 6 7.89012 일치: ^^^^^ ^^ ^^^ ^^^^ ^^^^^ ^^^^^^^( 예 ) 메모소수점 왼쪽의 숫자를 선택 사항으로 만들어 0.011과 .2를 모두 찾을 수 있었습니다.
\.
이렇게 하려면 와 정확히 소수점 한 자리를 일치시키고 와 소수점 오른쪽에 최소한 한 자릿수를 일치시켜야 했습니다 \d+
. 위의 정규식은 3.
소수점 오른쪽에 최소한 한 자리 숫자가 일치해야 하기 때문에 와 같은 숫자와 일치하지 않습니다.
평소처럼 몇 가지 간단한 문제를 해결해 보겠습니다.
아래 문장에서 모든 영어 단어를 찾아보세요.무늬: 문자열: 3 더하기 3 은 6이지만 4 더하기 3은 7 입니다. 일치 항목: ^^^^ ^^ ^^^ ^^^ ^^^^ ^^^^^ ^^( 해결 방법 ) 아래 목록에서 모든 파일 크기 기호를 찾으십시오. 파일 크기는 숫자(소수점이 있거나 없음) 뒤에
KB
, MB
또는 GB
: 으로 구성됩니다 TB
.
무늬: 문자열: 11TB 13 14.4MB 22HB 9.9GB 0KB 일치: ^^^^ ^^^^^^ ^^^^^ ^^^( 해결책 )
9단계: '선택적' 물음표?
마지막 문제를 해결하기 위해 이미 정규식을 작성하셨나요? 효과가 있었나요? 이제 여기에 적용해 보세요.
무늬: 문자열: 1..3KB 5...GB ..6TB 성냥:분명히 이러한 지정 중 어느 것도 유효한 파일 크기가 아니므로 좋은 정규식은 둘 중 하나와 일치해서는 안 됩니다. 마지막 문제를 해결하기 위해 제가 작성한 솔루션은 적어도 부분적으로는 모두 일치합니다.
패턴: \d+\.*\d*[KMGT]B 문자열: 1..3KB 5...GB .. 6TB 일치: ^^^^^^ ^^^^^^ ^^^( 예시 ) 그럼 무엇이 문제일까요? 사실, 소수점이 있다면 하나만 찾으면 됩니다. 그러나
*
0을 포함하여 모든 수의 일치가 허용됩니다. 0회 또는 1회만 일치시키는 방법이 있나요? 하지만 한 번 이상은 안 되나요? 물론 그렇습니다. "선택적"은 ?
이전 문자 중 0개 또는 1개와 일치하지만 그 이상은 일치하지 않는 수정자입니다.
패턴: \d+\.?\d*[KMGT]B 문자열: 1.. 3KB 5...GB .. 6TB 일치: ^^^ ^^^( 예 ) 여기서는 해결책에 더 가깝지만 이것이 우리에게 필요한 것은 아닙니다. 나중에 몇 단계를 거쳐 이 문제를 해결하는 방법을 살펴보겠습니다.
그동안 이 문제를 해결해 보겠습니다.
일부 프로그래밍 언어(예: Java)에서는 일부 정수 및 부동 소수점(점) 숫자 뒤에l
/ L
및 f
/ F
가 표시되어 일반 int/double이 아닌 (각각) long/float로 처리되어야 함을 나타냅니다. 아래 줄에서 유효한 "긴" 숫자를 모두 찾으세요.
무늬: 문자열: 길이 13L 2l 19 L lL 0 개 일치: ^^^ ^^ ^^ ^( 해결책 )
10단계: "또는" 기호|
8단계에서는 다양한 유형의 부동 소수점 숫자를 찾는 데 어려움을 겪었습니다.
패턴: \d*\.\d+ 문자열: 0.011 .2 42 2.0 3.33 4.000 5 6 7.89012 일치: ^^^^^ ^^ ^^^ ^^^^ ^^^^^ ^^^^^^^위의 패턴은 소수점이 있는 숫자와 소수점 오른쪽에 최소한 한 자리 이상의 숫자를 일치시킵니다. 하지만 다음과 같은 문자열도 일치시키고 싶다면 어떻게 해야 할까요
0.
? (소수점 오른쪽에는 숫자가 없습니다.) 다음과 같은 정규식을 작성할 수 있습니다.
패턴: \d*\.\d* 문자열: 0.011 .2 42 2.0 3.33 4.000 5 6 7.89012 0. . 일치 항목: ^^^^^ ^^ ^^^ ^^^^ ^^^^^ ^^^^^^^ ^^ ^( 예 ) 위에서 볼 수 있듯이 이는 과 일치
0.
하지만 단일 점 과도 일치합니다 . .
실제로 우리가 일치시키려는 것은 두 가지 다른 문자열 클래스입니다.
- 소수점 이하 한자리 이상의 숫자
- 소수점 왼쪽에 최소한 한 자리 이상의 숫자
패턴: \d*\.\d+ 문자열: 0.011 .2 42 2.0 3.33 4.000 5 6 7.89012 0. . 일치 항목: ^^^^^ ^^ ^^^ ^^^^ ^^^^^ ^^^^^^^
패턴: \d+\.\d* 문자열: 0.011 .2 42 2.0 3.33 4.000 5 6 7.89012 0. . 일치 항목: ^^^^^ ^^^ ^^^^ ^^^^^ ^^^^^^^ ^^이러한 경우 중 하위 문자열
42
, 또는 가 5
엔진 에 의해 발견되지 않는다는 것을 알 수 있습니다. 필요한 결과를 얻으려면 이러한 정규식을 결합해도 문제가 되지 않습니다. 어떻게 이를 달성할 수 있나요? "or" 기호를 사용하면 정규 표현식에서 한 번에 여러 가능한 일치 시퀀스를 지정할 수 있습니다. "or" 기호를 사용하여 대체 단일 문자를 지정할 수 있는 것처럼 대체 다중 문자 표현식을 지정할 수 있습니다. 예를 들어, "개"나 "고양이"를 찾으려면 다음과 같이 작성할 수 있습니다. 6
.
|
[]
|
패턴: \w\w\w 문자열: 분명히 개 는 고양이 보다 더 나은 애완 동물 입니다 . 일치 항목: ^^^^^^^^^ ^^^ ^^^^^^ ^^^ ^^^ ^^^( 예 ) ... 하지만 이는 "단어" 클래스의 모든 삼중 문자 시퀀스와 일치합니다. 하지만 "dog"과 "cat"에는 공통 문자가 없기 때문에 여기서 대괄호는 도움이 되지 않습니다. 다음은 두 단어 모두와 일치하는 데 사용할 수 있는 가장 간단한 정규식입니다.
패턴: dog|cat string: 분명히 개가 고양이 보다 더 나은 애완동물입니다 . 일치: ^^^ ^^^( 예 ) 정규식 엔진은 먼저 전체 시퀀스를 문자 왼쪽에 일치시키려고 시도하고
|
, 실패할 경우 문자 오른쪽에 있는 시퀀스를 일치시키려고 시도합니다 |
. 여러 문자를 |
연결하여 두 개 이상의 대체 시퀀스와 일치시킬 수도 있습니다.
패턴: dog|cat|pet string: 분명히 개가 고양이 보다 더 나은 애완동물 입니다 . 일치 항목: ^^^ ^^^ ^^^( 예 )
이제 이 단계를 더 잘 이해하기 위해 또 다른 몇 가지 문제를 해결해 보겠습니다.
부호를 사용하여|
위의 10진수 정규 표현식을 수정하면 다음과 같은 결과가 생성됩니다.
무늬: 문자열: 0.011 .2 42 2.0 3.33 4.000 5 6 7.89012 0. . 일치 항목: ^^^^^ ^^ ^^^ ^^^^ ^^^^^ ^^^^^^^ ^^( 해결 방법 ) 이전 단계 끝의 문제에서 설명한 대로 부호
|
, 문자 클래스, "선택적" 등을 사용하여 정수 및 부동 소수점(점) 숫자 모두와 일치하는 단일 정규식을 만듭니다(이 문제는 약간 ?
더 복잡합니다. 그렇습니다 ;))
무늬: 문자열: 42L 12 x 3.4f 6l 3.3 0F LF .2F 0. 일치: ^^^ ^^ ^^^^ ^^ ^^^ ^^ ^^^ ^^( 해결 방법 ) 정규식을 익히는 20가지 간단한 단계. 파트 3 RegEx: 정규식을 마스터하기 위한 20가지 간단한 단계. 4부
GO TO FULL VERSION