JavaRush /Java Blog /Random-KO /RegEx: 정규식을 마스터하기 위한 20가지 간단한 단계. 2 부
Artur
레벨 40
Tallinn

RegEx: 정규식을 마스터하기 위한 20가지 간단한 단계. 2 부

Random-KO 그룹에 게시되었습니다
RegEx: 정규식을 마스터하기 위한 20가지 간단한 단계. Part 1 원본은 여기에 있습니다. 마지막 부분에서 우리는 가장 간단한 정규식을 마스터했고 이미 뭔가를 배웠습니다. 이 부분에서는 좀 더 복잡한 디자인을 공부할 것입니다. 하지만 생각만큼 어렵지는 않을 것입니다. RegEx: 정규식을 마스터하기 위한 20가지 간단한 단계.  파트 2 - 1그럼 계속하자!

8단계: 별표 *및 더하기 기호+

RegEx: 정규식을 마스터하기 위한 20가지 간단한 단계.  파트 2 - 2지금까지 우리는 주어진 길이의 문자열만 일치시킬 수 있었습니다. 하지만 최근 문제에서는 지금까지 본 표기법으로 할 수 있는 작업의 한계에 도달했습니다. 예를 들어, 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단계: '선택적' 물음표?

RegEx: 정규식을 마스터하기 위한 20가지 간단한 단계.  파트 2 - 3마지막 문제를 해결하기 위해 이미 정규식을 작성하셨나요? 효과가 있었나요? 이제 여기에 적용해 보세요.
무늬:
문자열: 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/ Lf/ F가 표시되어 일반 int/double이 아닌 (각각) long/float로 처리되어야 함을 나타냅니다. 아래 줄에서 유효한 "긴" 숫자를 모두 찾으세요.
무늬:
문자열:   길이 13L 2l 19 L lL 0 
개 일치: ^^^ ^^ ^^ ^ 
( 해결책 )

10단계: "또는" 기호|

RegEx: 정규식을 마스터하기 위한 20가지 간단한 단계.  파트 2 - 48단계에서는 다양한 유형의 부동 소수점 숫자를 찾는 데 어려움을 겪었습니다.
패턴: \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.하지만 단일 점 과도 일치합니다 . .실제로 우리가 일치시키려는 것은 두 가지 다른 문자열 클래스입니다.
  1. 소수점 이하 한자리 이상의 숫자
  2. 소수점 왼쪽에 최소한 한 자리 이상의 숫자
다음 2개의 정규식을 서로 독립적으로 작성해 보겠습니다.
패턴: \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부
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION