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

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

Random-KO 그룹에 게시되었습니다
RegEx: 정규식을 마스터하기 위한 20가지 간단한 단계. 1부. RegEx: 정규식을 익히는 20가지 간단한 단계. 파트 2: 이 파트에서는 ​​좀 더 복잡한 내용으로 넘어갈 것입니다. 그러나 이전과 마찬가지로 그것들을 익히는 것은 어렵지 않을 것입니다. RegEx는 처음에 보이는 것보다 실제로 더 쉬우며, RegEx를 숙달하고 실제로 사용하기 위해 로켓 과학자가 될 필요는 없다는 점을 반복합니다. 이 기사의 영어 원본은 여기에 있습니다 . 정규식을 마스터하기 위한 20가지 간단한 단계  파트 3 - 1

11단계: ()그룹 캡처로서의 괄호

정규식을 마스터하기 위한 20가지 간단한 단계  파트 3 - 2마지막 문제에서는 다양한 유형의 정수값과 부동소수점(점) 숫자값을 찾아보았습니다. 그러나 정규식 엔진은 모든 것이 하나의 큰 정규식에 캡처되므로 이 두 가지 유형의 값을 구별하지 않았습니다. 미니 패턴을 괄호로 묶으면 정규식 엔진이 다양한 일치 유형을 구별하도록 지시할 수 있습니다.
패턴: ([AZ])|([az]) 
문자열:   현 볼리비아 대통령은 Evo Morales 입니다 .
일치 항목: ^^^ ^^^^^^^ ^^^^^^^^^ ^^^^^^^ ^^ ^^^ ^^^^^^^ 
그룹:    122 2222222 122222222 22 1222222 22 122 1222222  
( ) 위의 정규식은 1부터 시작하여 인덱싱되는 두 개의 캡처 그룹을 정의합니다. 첫 번째 캡처 그룹은 단일 대문자와 일치하고 두 번째 캡처 그룹은 단일 소문자와 일치합니다. |'or' 기호 와 괄호를 캡처 그룹으로 사용하면 ()여러 종류의 문자열과 일치하는 단일 정규식을 정의할 수 있습니다. 이를 기사 이전 부분의 긴/부동 검색 정규식에 적용하면 정규식 엔진은 해당 그룹에서 해당 일치 항목을 캡처합니다. 부분 문자열이 일치하는 그룹을 확인하면 그것이 float 값인지, long 값인지 즉시 확인할 수 있습니다.
패턴: (\d*\.\d+[fF]|\d+\.\d*[fF]|\d+[fF])|(\d+[lL]) 문자열: 42L 
12   x 3.4f 6l 3.3 0F LF .2F 0.
일치 항목: ^^^ ^^^^ ^^ ^^ ^^^ 
그룹:    222 1111 22 11 111  
( ) 이 정규 표현식은 매우 복잡합니다. 더 잘 이해하기 위해 이를 분해하여 다음 패턴을 각각 살펴보겠습니다.
( // "float" 하위 문자열과 일치합니다.
  \d*\.\d+[fF]
  |
  \d+\.\d*[fF]
  |
  \d+[fF]
)
| // 또는
( // "긴" 하위 문자열과 일치합니다.
  \d+[lL]
)
괄호 안의 부호 |및 캡처 그룹을 사용하면 ()다양한 유형의 하위 문자열을 일치시킬 수 있습니다. 이 경우 부동 소수점 숫자 "float" 또는 긴 정수 "long"을 일치시킵니다.
(
  \d*\.\d+[fF] // 소수점 오른쪽 1자리 이상
  |
  \d+\.\d*[fF] // 소수점 왼쪽 1자리 이상
  |
  \d+[fF] // 점이 없고 1자리 이상의 숫자만 가능
)
|
(
  \d+[lL] // 점이 없고 1자리 이상의 숫자만 가능
)
"float" 캡처 그룹에는 세 가지 옵션이 있습니다. 소수점 오른쪽에 최소 1자리가 있는 숫자, 소수점 왼쪽에 최소 1자리가 있는 숫자, 소수점이 없는 숫자입니다. 끝에 문자 "f" 또는 "F"가 추가되어 있는 한 이들 모두는 "부동"입니다. "긴" 캡처 그룹 내에는 하나의 옵션만 있습니다. 문자 "l" 또는 "L"이 뒤에 오는 1개 이상의 숫자가 있어야 합니다. 정규식 엔진은 주어진 문자열에서 이러한 하위 문자열을 찾아 적절한 캡처 그룹으로 인덱싱합니다. 메모"l", "L", "f" 또는 "F"가 추가되지 않은 숫자와 일치하지 않습니다. 이 숫자는 어떻게 분류되어야 합니까? 음, 소수점이 있는 경우 Java 언어의 기본값은 "double"입니다. 그렇지 않으면 "int"여야 합니다.

몇 가지 퍼즐을 통해 우리가 배운 내용을 통합해 보겠습니다.

위 정규식에 두 개의 캡처 그룹을 더 추가하여 double 또는 int 숫자도 분류합니다. (이것은 또 다른 까다로운 질문입니다. 시간이 좀 걸리더라도 낙담하지 마십시오. 최후의 수단으로 내 솔루션을 참조하십시오.)
무늬:
문자열:   42L 12 x 3.4f 6l 3.3 0F LF .2F 0. 
일치: ^^^ ^^ ^^^^ ^^ ^^^ ^^ ^^^ ^^ 
그룹:    333 44 1111 33 222 11 111 22
( 해결책 ) 다음 문제는 좀 더 간단합니다. 괄호로 묶인 캡처 ​​그룹 (), '또는' 기호 |및 문자 범위를 사용하여 '미국에서 음주가 합법'인 연령을 정렬합니다. (>= 21) 및 "미국에서는 음주가 허용되지 않습니다"(<21):
무늬:
문자열:   7 10 17 18 19 20 21 22 23 24 30 40 100 120 
일치: ^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ 
그룹:    2 22 22 22 22 22 11 11 11 11 11 11 111 111 
( 해결책 )

12단계: 보다 구체적인 일치 항목을 먼저 식별합니다.

정규식을 마스터하기 위한 20가지 간단한 단계  파트 3 - 3"법적 음주자"를 두 번째 캡처 그룹이 아닌 첫 번째 캡처 그룹으로 정의하려고 하면 마지막 작업에서 약간의 문제가 발생했을 수 있습니다. 이유를 이해하기 위해 다른 예를 살펴보겠습니다. 4자 미만의 성과 4자 이상의 성을 별도로 기록하고 싶다고 가정해 보겠습니다. 첫 번째 캡처 그룹에 더 짧은 이름을 지정하고 무슨 일이 일어나는지 살펴보겠습니다.
패턴: ([AZ][az]?[az]?)|([AZ][az][az][az]+) 
문자열:   Kim JobXu Clo yd Moh r Ngo Roc k.
일치 항목: ^^^ ^^^ ^^ ^^^ ^^^ ^^^ ^^^ 
그룹:    111 111 11 111 111 111 111   
( ) 기본적으로 대부분의 정규식 엔진은 지금까지 본 기본 문자에 대해 탐욕적 일치를 사용합니다. 이는 정규식 엔진이 제공된 정규식에서 가능한 한 빨리 정의된 가장 긴 그룹을 캡처함을 의미합니다. 따라서 위의 두 번째 그룹은 예를 들어 "Jobs" 및 "Cloyd"와 같은 이름에서 더 많은 문자를 캡처할 수 있지만 해당 이름의 처음 세 문자는 이미 첫 번째 캡처 그룹에서 캡처되었으므로 두 번째 캡처 그룹에서 다시 캡처할 수 없습니다. . 이제 약간의 수정을 가해 보겠습니다. 캡처 그룹의 순서를 변경하여 보다 구체적인(긴) 그룹을 먼저 배치합니다.
패턴: ([AZ][az][az][az]+)|([AZ][az]?[az]?) 
문자열:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
일치 항목: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
그룹:    222 1111 22 11111 1111 222 1111    
( )

작업... 이번에는 하나만 :)

"보다 구체적인" 패턴은 거의 항상 "더 긴"을 의미합니다. 두 가지 종류의 "단어"를 찾고 싶다고 가정해 보겠습니다. 먼저 모음으로 시작하는 단어(보다 구체적으로), 다음으로 모음으로 시작 하지 않는 단어 (다른 단어)입니다. 이 두 그룹과 일치하는 문자열을 캡처하고 식별하려면 정규식을 작성해 보세요. (아래 그룹은 번호가 아닌 문자로 표시됩니다. 첫 번째 그룹과 두 번째 그룹에 해당하는 그룹을 결정해야 합니다.)
무늬:
문자열:   pds6f uub 24r2gp ewqrty l ui_op 
일치: ^^^^^ ^^^ ^^^^^^ ^^^^^^ ^ ^^^^^ 
그룹:    NNNNN VVV NNNNNN VVVVVV N VVVVV
( 해결책 ) 일반적으로 정규 표현식이 정확할수록 결과가 길어집니다. 그리고 정확도가 높을수록 필요하지 않은 것을 캡처할 가능성이 줄어듭니다. 따라서 무섭게 보일 수 있지만 더 긴 정규 표현식 ~= 더 나은 정규 표현식입니다. 안타깝게도 .

{}13단계: 특정 반복 횟수에 대한 중괄호

정규식을 마스터하기 위한 20가지 간단한 단계  파트 3 - 4이전 단계의 성을 사용한 예에서는 하나의 패턴으로 거의 반복되는 2개의 그룹이 있었습니다.
패턴: ([AZ][az][az][az]+)|([AZ][az]?[az]?) 
문자열:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
일치 항목: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
그룹:    222 1111 22 11111 1111 222 1111    
첫 번째 그룹에는 4글자 이상의 성이 필요했습니다. 두 번째 그룹은 3자 이하의 성을 캡처해야 했습니다. [a-z]이 그룹을 계속 해서 반복하는 것보다 더 쉽게 작성할 수 있는 방법이 있습니까 ? 이에 대해 중괄호를 사용하는 경우 존재합니다 {}. 중괄호를 사용 {}하면 이전 문자 또는 캡처 그룹과 일치하는 최소 및 (선택적으로) 최대 일치 수를 지정할 수 있습니다. 세 가지 사용 사례가 있습니다 {}.
{X} // 정확히 X번 일치합니다.
{X,} // >= X번 일치
{X,Y} // >= X 및 <= Y 번과 일치합니다.
다음은 세 가지 다른 구문의 예입니다.
패턴: [az]{11} 
문자열:   humuhumunuk unukuapua'a.
일치: ^^^^^^^^^^^^^   
( )
패턴: [az]{18,} 
문자열:   humuhumunukunukuapua 'a.
일치 항목: ^^^^^^^^^^^^^^^^^^^^^^^    
( )
패턴: [az]{11,18} 
문자열:   humuhumunukunukuap ua'a.
일치 항목: ^^^^^^^^^^^^^^^^^^^^    
( ) 위의 예에는 몇 가지 주의할 점이 있습니다.메모:. 먼저, {X} 표기법을 사용하면 이전 문자나 그룹이 해당 숫자(X)번과 정확하게 일치합니다. 첫 번째 예에 표시된 대로 패턴과 일치할 수 있는 문자(숫자 X보다)가 "단어"에 더 많은 경우 해당 문자는 일치 항목에 포함되지 않습니다. 문자 수가 X보다 적으면 전체 일치가 실패합니다(첫 번째 예에서 11을 99로 변경해 보십시오). 둘째, {X,} 및 {X,Y} 표기법은 탐욕적입니다. 그들은 주어진 정규 표현식을 만족시키면서 가능한 한 많은 문자를 일치시키려고 노력할 것입니다. {3,7}을 지정하면 3~7자가 일치할 수 있으며 다음 7자가 유효하면 7자가 모두 일치됩니다. {1,}을 지정하고 다음 14,000자가 모두 일치하면 해당 문자 중 14,000자가 모두 해당 문자열에 포함됩니다. 위의 표현을 다시 작성하기 위해 이 지식을 어떻게 사용할 수 있습니까? [a-z]가장 간단한 개선은 이웃 그룹을 다음과 같이 바꾸는 것입니다 [a-z]{N}. 여기서 N은 그에 따라 선택됩니다.
패턴: ([AZ][az]{2}[az]+)|([AZ][az]?[az]?)  
...하지만 그렇다고 해서 상황이 훨씬 나아지는 것은 아닙니다. 첫 번째 캡처 그룹을 살펴보세요. [a-z]{2}(정확히 2개의 소문자와 일치)가 있고 [a-z]+그 뒤에 (1개 이상의 소문자와 일치)가 있습니다. 중괄호를 사용하여 3개 이상의 소문자를 요청하여 이를 단순화할 수 있습니다.
패턴: ([AZ][az]{3,})|([AZ][az]?[az]?) 
두 번째 캡처 그룹은 다릅니다. 이러한 성에는 3자 이상이 필요하지 않습니다. 즉, 상한선이 있지만 하한선은 0입니다.
패턴: ([AZ][az]{3,})|([AZ][az]{0,2}) 
정규식을 사용할 때 구체성은 항상 더 좋으므로 거기서 멈추는 것이 현명할 것입니다. 그러나 서로 옆에 있는 두 문자 범위( [AZ]및 )는 거의 "단어 문자" 클래스 ( ) 처럼 보입니다. . 데이터에 올바른 형식의 성만 포함되어 있다고 확신한다면 정규식을 단순화하고 다음과 같이 간단히 작성할 수 있습니다. [az]\w[A-Za-z0-9_]
패턴: (\w{4,})|(\w{1,3}) 
첫 번째 그룹은 4개 이상의 "단어 문자"( [A-Za-z0-9_]) 시퀀스를 캡처하고, 두 번째 그룹은 1~3개의 "단어 문자"(포함) 시퀀스를 캡처합니다. 이게 효과가 있을까요?
패턴: (\w{4,})|(\w{1,3}) 
문자열:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
일치 항목: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
그룹:    222 1111 22 11111 1111 222 1111    
( 예제 ) 성공했어요! 이 접근 방식은 어떻습니까? 그리고 이전 예보다 훨씬 깨끗합니다. 첫 번째 캡처 그룹은 4자 이상의 모든 성을 일치시키므로 두 번째 캡처 그룹을 간단히 으로 변경할 수도 있습니다 \w+. 이렇게 하면 나머지 모든 성(1, 2 또는 3자)을 캡처할 수 있기 때문입니다.
패턴: (\w{4,})|(\w+) 
문자열:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
일치 항목: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
그룹:    222 1111 22 11111 1111 222 1111    
( )

두뇌가 이를 학습하고 다음 2가지 문제를 해결하도록 도와주세요.

중괄호를 사용하여 {}7단계의 주민등록번호 조회 정규식을 다시 작성합니다.
무늬:
문자열: 113-25=1902 182-82-0192 H23-_3-9982 1I1-O0-E38B
일치:              ^^^^^^^^^^^^^
( 해결 방법 ) 웹사이트의 비밀번호 강도 검사기에서 사용자 비밀번호가 6~12자여야 한다고 가정합니다. 아래 목록에서 잘못된 비밀번호 에 플래그를 지정하는 정규식을 작성하세요 . 각 비밀번호는 ()쉽게 일치하도록 괄호 안에 포함되어 있으므로 정규식이 리터럴 ()기호 문자로 시작하고 끝나는지 확인하세요. 힌트: 비밀번호에 문자 그대로의 괄호를 허용하지 않도록 하십시오 [^()]. 그렇지 않으면 전체 문자열과 일치하게 됩니다!
무늬:
문자열:   (12345) (내 비밀번호) (Xanadu.2112) (su_do) (OfSalesmen!)
일치 항목: ^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^  
( 해결책 )

14단계: \b너비가 0인 테두리 기호

정규식을 마스터하기 위한 20가지 간단한 단계  파트 3 - 5마지막 작업은 꽤 어려웠습니다. ""하지만 비밀번호를 괄호 대신 따옴표 로 묶어 좀 더 복잡하게 만들면 어떨까요 ()? 모든 괄호 문자를 따옴표 문자로 바꾸는 것만으로 유사한 솔루션을 작성할 수 있습니까?
패턴: \"[^"]{0.5}\"|\"[^"]+\s[^"]*\" 
문자열:   "12345" "내 비밀번호" "Xanadu.2112 " " su_do" " OfSalesmen! "
일치 항목: ^^^^^^^ ^^^^^^^^^^^^^^^ ^^^ ^^^  
( ) 그다지 인상적이지는 않았습니다. 그 이유를 이미 짐작하셨나요? 문제는 여기서 잘못된 비밀번호를 찾고 있다는 것입니다. "Xanadu.2112"는 좋은 비밀번호이므로 정규식이 이 시퀀스에 공백이나 리터럴 문자가 포함되어 있지 않다는 것을 인식하면 오른쪽의 비밀번호를 한정하는 "문자 바로 앞에 결과가 나옵니다 . "( 왜냐하면 를 "사용하여 비밀번호 내에서 문자를 찾을 수 없도록 지정했기 [^"]때문입니다.) 정규식 엔진이 해당 문자가 특정 정규식과 일치하지 않는다고 판단하면 정확히 중단된 위치, 즉 문자가 있었던 위치에서 다시 실행됩니다 ". 이는 " Xanadu.2112'가 오른쪽에 있습니다. 거기에서 그는 하나의 공백 문자와 다른 문자를 봅니다 ". 그에게는 이것은 잘못된 비밀번호입니다! 기본적으로 그는 이 시퀀스를 찾아 " "계속 진행합니다. 이것은 우리가 원하는 것이 전혀 아닙니다... 비밀번호의 첫 번째 문자가 공백이 아니 어야 한다고 지정할 수 있다면 좋을 것입니다. 이를 수행할 수 있는 방법이 있습니까? (지금쯤이면 여러분은 아마도 나의 모든 수사학적 질문에 대한 대답이 "예"라는 것을 깨달았을 것입니다.) 예! 그런 방법이 있어요! 많은 정규식 엔진은 "단어 경계"와 같은 이스케이프 시퀀스를 제공합니다 \b. "단어 경계"는 \b이상하게도 단어 경계와 일치하는 너비가 0인 이스케이프 시퀀스입니다. "단어"라고 말할 때는 클래스에 있는 임의의 문자 시퀀스 \w또는 를 의미한다는 점을 기억하세요 [A-Za-z0-9_]. 단어 경계 일치는 시퀀스 바로 앞이나 뒤의 문자가 단어 문자 \b여야 함을 의미합니다. не그러나 일치 시 캡처된 하위 문자열에는 이 문자가 포함되지 않습니다. 너비가 0입니다. 이것이 어떻게 작동하는지 알아보기 위해 작은 예를 살펴보겠습니다.
패턴: \b[^ ]+\b 
문자열:   아직 돈이 부족해요 , Lebowski .
일치 항목: ^^ ^^^^^ ^^^^ ^^ ^^^^^ ^^^^^^^^  
( ) 시퀀스는 [^ ]리터럴 공백 문자가 아닌 모든 문자와 일치해야 합니다. ,그렇다면 이것은 왜 돈 뒤의 쉼표나 레보스키 뒤의 마침표 "와 일치하지 않는 걸까요 .? 이는 쉼표 ,와 마침표가 단어 문자가 아니기 때문에 단어 문자와 비단어 문자 사이에 경계 .가 생기기 때문입니다. 돈이라는 단어와 그 뒤에 오는 y쉼표 , 그리고 " Lebowski라는 단어와 그 뒤에 오는 마침표 (마침표/마침표) 사이. 정규식은 이러한 단어의 경계에서 일치합니다(단, 단어 정의에만 도움이 되는 비단어 문자에서는 일치하지 않음). 하지만 템플릿에 일관성을 포함하지 않으면 어떻게 될까요 ?,i.\b
패턴: [^ ]+ 
문자열:   아직 돈이 부족해요, Lebowski. 
일치: ^^ ^^^^^ ^^^^ ^^ ^^^^^^ ^^^^^^^^^  
( ) 네, 이제 이러한 구두점도 찾을 수 있습니다. 이제 단어 경계를 사용하여 인용된 비밀번호에 대한 정규식을 수정해 보겠습니다.
패턴: \"\b[^"]{0.5}\b\"|\"\b[^"]+\s[^"]*\b\" 
문자열:   "12345" "내 비밀번호" " Xanadu. 2112" "su_do" "OfSalesmen!"
일치 항목: ^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^  
( ) 따옴표("\b ... \b") 안에 단어 경계를 배치함으로써 일치하는 비밀번호의 첫 번째와 마지막 문자가 "단어 문자"여야 함을 효과적으로 의미합니다. 따라서 여기서는 잘 작동하지만 사용자 비밀번호의 첫 번째 또는 마지막 문자가 단어 문자가 아닌 경우에는 작동하지 않습니다.
패턴: \"\b[^"]{0.5}\b\"|\"\b[^"]+\s[^"]*\b\"
문자열: "thefollowingpasswordistooshort" "C++"
성냥:   
( ) 두 번째 비밀번호가 너무 짧음에도 불구하고 어떻게 "유효하지 않음"으로 표시되지 않는지 확인하세요. 당신은해야합니다주의 깊은시퀀스를 사용하면 \b문자 사이의 경계만 일치 \w하고 그렇지 않기 때문입니다 \w. 위의 예에서는 비밀번호에 문자가 아닌 문자를 허용했기 때문에 비밀번호의 첫 번째/마지막 문자 \w사이의 경계가 \단어 경계라고 보장할 수 없습니다 \b.

이 단계를 완료하려면 다음과 같은 간단한 문제 하나만 해결하겠습니다.

단어 경계는 특정 문자 시퀀스를 일치시키려고 할 때 구문 강조 엔진에 유용하지만 단어의 시작이나 끝에서만(또는 단독으로) 발생하는지 확인하려고 합니다. 구문 강조를 작성 중이고 var라는 단어를 강조하고 싶지만 해당 단어가 그 자체로 나타날 때만(단어의 다른 문자를 건드리지 않고) 강조한다고 가정해 보겠습니다. 이에 대한 정규식을 작성할 수 있나요? 물론 가능합니다. 매우 간단한 작업입니다. ;)
무늬:
문자열:   var varx _var ( var j) barvarcar * var var -> { var }
일치 항목: ^^^ ^^^ ^^^ ^^^ ^^^  
( 해결책 )

15단계: ^"라인 시작"으로 "캐럿", $"라인 끝"으로 달러 기호

정규식을 마스터하기 위한 20가지 간단한 단계  파트 3 - 6단어 경계 시퀀스 \b(기사 이전 부분의 마지막 단계에 있음)는 정규식에 사용할 수 있는 유일한 너비가 없는 특수 시퀀스가 ​​아닙니다. 가장 인기 있는 두 가지 기호는 "캐럿" ^- "줄의 시작" 및 달러 기호 $- "줄의 끝"입니다. 정규식에 다음 중 하나를 포함하면 일치 항목이 소스 문자열의 시작이나 끝 부분에 나타나야 합니다.
패턴: ^start|end$ 
문자열:   시작 끝 시작 끝 시작 끝 시작  
일치: ^^^^^ ^^^  
( ) 문자열에 줄 바꿈이 포함되어 있으면 ^start줄 시작 부분의 "start" 시퀀스와 일치하고 end$줄 끝의 "end" 시퀀스와 일치합니다(여기에서는 표시하기 어렵습니다). 이러한 기호는 구분 기호가 포함된 데이터로 작업할 때 특히 유용합니다. ^"줄 시작"을 사용하여 9단계의 "파일 크기" 문제로 돌아가 보겠습니다 . 이 예에서는 파일 크기가 공백 " "으로 구분됩니다. 따라서 우리는 각 파일 크기가 숫자로 시작하고 그 앞에 공백 문자나 줄의 시작이 오기를 원합니다.
패턴: (^| )(\d+|\d+\.\d+)[KMGT]B 
문자열:   6.6KB 1..3KB 12KB 5G 3.3MB KB .6.2TB 9MB .
일치 항목: ^^^^^ ^^^^^ ^^^^^^ ^^^^ 
그룹:    222 122 1222 12    
( 예시 ) 벌써 목표에 너무 가까워졌어요! 그러나 여전히 한 가지 작은 문제가 있음을 알 수 있습니다. 유효한 파일 크기 앞에 공백 문자를 일치시키는 것입니다. 이제 정규식 엔진이 이를 발견하면 이 캡처링 그룹(1)을 무시하거나 다음 단계에서 볼 수 있는 비캡처 그룹을 사용할 수 있습니다.

그동안 톤에 관한 2가지 문제를 더 해결해 보겠습니다.

마지막 단계의 구문 강조 예제를 계속하면 일부 구문 강조는 후행 공백, 즉 공백이 아닌 문자와 줄 끝 사이에 오는 모든 공백을 표시합니다. 후행 공백만 강조 표시하는 정규식을 작성할 수 있나요?
무늬:
문자열: myvec <- c(1, 2, 3, 4, 5)  
일치:                          ^^^^^^^  
( 해결 방법 ) 간단한 쉼표로 구분된 값(CSV) 파서는 쉼표로 구분된 "토큰"을 찾습니다. 일반적으로 공백은 따옴표로 묶지 않으면 의미가 없습니다 "". 쉼표 사이의 토큰과 일치하지만 따옴표 사이에 있지 않은 공백을 무시(캡처하지 않음)하는 간단한 CSV 구문 분석 정규식을 작성합니다 .
무늬:
문자열:   a, "b", "c d",e,f, "g h", dfgi,, k, "", l 
일치: ^^ ^^^^^^^^^^^^^^^^ ^^ ^^^ ^^^^^^ ^^ ^^^ ^ 
그룹 :    21 2221 2222212121 222221 222211 21 221 2    
( 솔루션 ) RegEx: 정규식을 마스터하기 위한 20가지 간단한 단계. 4부.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION