정규식을 어떻게 배우나요? [닫은]


80

어디서 배울 지 묻지 않습니다 . 온라인에서 좋은 자료와 책 등을 많이 찾았습니다.

그러나 어떻게 도대체 내가 그들을 해결합니다. 그것의 시작은 어디입니까? 정규식 프로세서는 언제 텍스트를 진행합니까, 언제 서서 다른 일치를 시도합니까? 기타

이집트 피라미드에서 상형 문자를 찾으려고합니다.


2
정렬의 주제에 - regular-expressions.info . 아래에 @Jalayn의 제안을 사용하십시오. 함으로써 배우십시오!
Freiheit

6
gskinner.com/RegExr 은 내가 찾은 정규식을 개발하기위한 최고의 도구입니다.
Callum Rogers

한 번에 조금. 간단한 것 ( "aaa", "aa.", "a * b"등)으로 시작하여 구현 별 구성 요소 (예 : PCRE)에 따라 작업하십시오. 그런 다음 패턴을 생각해 내고 그에 맞는 정규식을 만드십시오.
tylerl

나는 훌륭한 프로그램 RegexBuddy로 시행 착오를 통해 배웠다. regexbuddy.com (이것은 광고에 대한 크레딧을 얻지 못합니다,이 프로그램은 실제로 배우기 쉬웠습니다)
Yam Marcovic

rubular.com정규식 개발을위한 훌륭한 도구입니다.
즐러

답변:


68

저는 Automata 이론에 대한 지식이 이해에 중요 하다고 생각합니다 .

오토 마톤이 무엇인지, 정규 언어 가 어떻게 정의 되는지 이해하면 정규 표현식 을 이해하는 것이 훨씬 쉬울 것입니다.

다양한 구현 사이의 특정 구문과 차이점에 관해서는 ... 기억해야 할 것이 있습니다. 있습니다 보조 그것에 대해 너무.

편집하다

아래의 의견 중 일부는 중요한 사항을 제기했습니다.

  1. 정규 표현식 (대부분의 프로그래밍 언어로 구현 됨)은 오토마타 이론에서 정규 표현식의 상위 집합이라는 것을 잊지 마십시오. 좋은 이론적 배경은 시작하기에 유용한 곳이지만 모든 것을 알려주지는 않습니다. (감사합니다, David Thornley)

  2. 여러 의견 제시 자들은 이론적 기초를 배우지 않고도 다양한 정규식 구문을 배울 수 있다고 말합니다. 작동 방식을 완전히 이해하지 않고 구문을 배울 수 있다는 것은 사실이지만, OP에 대한 이해는 완전히 이해하는 것이 었습니다. 문제는 실제 기반에 관한 것이 었습니다. 프로세서는 언제 발전합니까? 언제 멈추나요? 어떻게 일치하는지 결정합니까? 이것이 기초이며, 이론이며, 오토마타 이론에 기초합니다. 물론, 엔진 작동 방식을 몰라도 자동차를 운전할 수 있습니다. 그러나 "가스가 실제로 어떻게 구동되는지"라는 질문을 받으면 엔진이 어떻게 만들어 졌는지 대해 이야기해야합니다.


해설자 :이 질문의 더 나은 요점을 논의하려면 chat을 사용하십시오 . 그렇지 않은 경우 답을 남기거나 답이 가장 정확한 답변에 투표하십시오.

편집 해 주셔서 감사합니다. 이것은이 대답을 진실에 훨씬 가깝게 만든다. 나는 아직도 Automata Theory를 알아야한다고 생각하지는 않지만 (아는 모르겠지만 복잡한 정규 표현식을 작성할 수는 있음) 이론에 대한 지식이 도움이 될 수 있음에 동의합니다. 특히 역 추적이 어떻게 작동하고 욕심 많은 / 지저분한 / 포지티브 정량자가 제어하는지 아는 것이 실제로 이해하는 데 도움이 될 수 있습니다.
NikiC

내 2 센트 : MSDN의 Channel 9의 C ++ STL 정규식 라이브러리에 대한 최근 비디오 시리즈에서 발표자는 STL의 유지 관리자 인이 자동 완성 기능으로 구현한다고 말했다. 따라서이 이론을 알면 실제로 정규 표현식의 작동 방식에 대한 통찰력을 OP에 제공해야합니다.
korbes

5
나는 시작 진술에 전혀 동의하지 않습니다. 정규 표현을 배웠을 때 저는 오토마타 이론에 대해 아무것도 몰랐습니다. 30 년이 지난 후에도 여전히 그렇지 않습니다. 내가 아는 것은 매뉴얼 페이지를 읽고, 문자 그대로 사용하고, 프롬프트에서 실험하는 방법이었습니다.
Bryan Oakley

1
@Bryan 음 ... 당신의 경험이 요점을 증명합니다. 사용 방법을 알고 있을지 모르지만 작동 방식을 실제로 이해 하지 못합니다 . 당신이 경우에 - 당신은 알고 뭔가 당신이 그것을 이름을 모르더라도, 오토마타 이론에 대한합니다. 그러나 오토마타 이론을 알지 못하면 정규 표현식을 완전히 이해할 수 없으며 매뉴얼 페이지를 읽는 데 도움이되지 않습니다 (물론 오토마타 이론을 설명하는 매뉴얼 페이지를 읽고 있지 않는 한).
littleadv

36

연습함으로써.

웹 스크래핑으로 재미있게 배웠습니다. 나는 그저 재미로 혼자서 그런 것이 아니라고 확신합니다.

예 : 좋아하는 스포츠 웹 사이트에서 최신 축구, 테니스 (실제로 좋아하는 스포츠) 점수를 검색하는 코드를 작성하십시오. 코드를 작성하여 페이지를로드하고 정규 표현식으로 점수를 추출하여 콘솔이나 텍스트 파일로 출력하십시오. 정규식을 사용하면 점수 만 검색하고 다른 항목은 검색하지 않아야합니다. 때때로 이것은 꽤 도전적 일 수 있습니다 :-)

두 번째 예 : 좋아하는 웹 코믹의 사진을 검색하는 코드 (예 : Sinfest 를 많이 좋아함 )를 하드 드라이브 어딘가에 저장하는 코드를 작성하십시오. "img"태그와 그 내용을 검색하려면 정규식 만 사용하십시오. 선택적으로 제목이 어딘가에 저장된 경우 제목을 검색하십시오.


15
정규 표현식 으로
Maxpm

10
물론 나쁜 생각입니다. DOM / Sax 파서 또는 기타 전용 XML 리더를 사용하는 것이 "일반적으로"사용되어야합니다. 그러나 여기서의 주제는 정규 표현식 학습에 관한 것이며, "재미있는"방식으로 정규 표현식에 대해 배운 방법을 공유했습니다.
Jalayn

3
HTML 웹 페이지에 XML 파서를 사용하는 것은 정규식으로 스크랩하는 것보다 훨씬 나쁜 생각입니다.
skolima

8
아, 글쎄, 나는 그것에 대해 생각한 것에 대해 더 정확하고 싶었지만 게으르고 의견에 반응했다 ... 나는 우리가 모든 문서를 파싱하기 위해 정규 표현식을 사용하는 것이 좋지 않다는 것에 동의 할 수 있다고 생각한다. 2. XML 파서를 사용하여 HTML을 구문 분석하는 것은 나쁜 생각입니다. 3. XML 파서를 사용하여 XHTML을 구문 분석하는 것은 옳습니다. 또는 간단히 요약하면 다음과 같습니다. 올바른 작업을위한 올바른 도구 ...
Jalayn

23

나는 당신이 리소스를 요구하지는 않지만 Jeffrey EF Friedl의 정규 표현식 마스터 링 은 그들이 어떻게 작동하고 어떻게 사용하는지 배웠습니다. 다른 것들을 파싱하기 위해 많은 것들을 사용하는 시점에 도달 한 후에도 첫 번째 장에는 나에게 새로운 것들이있었습니다.

그 정규 표현식을 이해하고 싶습니까? 이 책을 읽으십시오.


2
이것이 정답이어야합니다.
날씬한

1
+100,000 최고의 기술 서적 중 하나이며 질문의 주제에 대해 편리합니다.
Affe

이 책을 좋아했습니다. 핵심은 Regex에서 사용할 수있는 모든 다른 기능을 이해하는 데 도움이되었다는 것입니다. 책을 읽음으로써 모든 구문을 기억할 수는 없지만, 책은 존재하는 모든 것을 보여 주므로 문제가 발생할 때 어떤 도구를 사용해야하는지 알 수 있습니다.
Kibbee

이 답변에 대한 +1. 나는 마침내 앉아서 필수 볼륨을 한 줄씩 읽을 때까지 정규 표현식에서 사라졌습니다. 이제 Friedl은 오늘날 우리를 괴롭히는 많은 비표준 변형을 통해 내 길을 추론 할 수있는 기초를 충분히 제공했습니다! 나는 OP와 다른 모든 사람들에게이 언급을 강력히 추천한다. 댓글로 @slim +1!
John Tobler

19

그것의 시작은 어디입니까? 정규식 프로세서는 언제 텍스트를 진행합니까, 언제 서서 다른 일치를 시도합니까? 기타

먼저 목표명확히 하고 학습 스타일알아내는 것부터 시작하겠습니다 .

귀하의 질문에 대해 가장 큰 충격은 "정규 표현을 어떻게 배우나요?"라는 질문입니다. "정규식 엔진은 어떻게 내부적으로 작동합니까?" 그 두 가지가 서로 관련이 있다는 것을 암시하는 것 같습니다. 어쩌면 당신은 무언가를 분해하거나 직접 만들어서 어떻게 작동하는지 배우는 사람 일 것입니다.

초보자 응용 프로그램의 경우 일반적으로 도구를 효과적으로 사용하기 위해 도구의 작동 방식을 이해할 필요가 없습니다. 목재에 구멍을 뚫기 위해 드릴 모터가 어떻게 작동하는지 알 필요는 없습니다. 당신이하는 방법을 이해하는 데 필요한 사용하는 드릴을, 어떻게하지하는 구축 드릴.

그래서 당신의 목표는 무엇입니까? 정규식 엔진 을 작성하는 방법을 배우려고 합니까? 또는 정규식효과적으로 사용하여 비즈니스 문제를 해결 하는 방법을 배우고 싶습니까? 이러한 다른 목표를 달성하려면 다른 학습 기술이 필요할 수 있습니다.

정규식 엔진의 작동 방식에 대한 특정 질문을 해결하려면 다음이 필요합니다. 정규 표현식에 대한 "고전적인"이론적 접근 방식은 정규 표현식을 비 결정적 유한 오토 마톤에 대한 청사진으로 사용한 다음 동등한 결정 론적 유한 오토 마톤을 빌드 한 다음 입력에 대해 해당 오토 마톤을 실행하는 것입니다.

실제로 여러 가지 이유로 아무도 실제로 이것을하지 않습니다 . 첫째, 가능한 수의 입력 문자 수를 곱한 상태 수에는 작은 정규식이라도 엄청나게 큰 상태 전이 테이블이 생성됩니다. 물론 대부분은 압축 할 수 있지만 여전히 많은 전환 규칙입니다. 둘째, 다른 접근 방식은 일반적으로 더 빠릅니다. 셋째, 소위 "정규"표현식은 현대 정규 표현식 라이브러리에 있으며 아무 것도 아닙니다. 그것들은 전혀 정규 언어 가 아닙니다 . 그것들은 종종 유한 오토마타 언어가 아닌 푸시 다운 오토마타로 인식됩니다.

(나는이 모든 것들이 어떻게 작동하는지에 대한 긴 시리즈를 작성하기 시작했지만 첫 12 기사 만 읽었을 때 증기가 부족했습니다 . 기본 정규 표현식의 이론적 배경에 대한 간단한 입문서를 원한다면 흥미로울 것입니다.)

실제 정규 표현식 엔진은 일반적으로 역 추적 전략을 사용합니다. 10 년 전에 JScript 엔진 용으로 구축 한 정규식 엔진은 이제 정규식을 시퀀스 인식 및 이전 상태로의 역 추적을위한 기본 요소를 포함하는 바이트 코드 언어로 컴파일합니다. 그런 다음 해당 바이트 코드 언어에 대한 인터프리터를 작성했습니다.

정규 표현식 을 사용 하는 방법을 상당히 확실하게 이해하기 전에 정규 표현식 엔진의 작동 방식을 이해하려고하지 않습니다 . 다양한 엔진에 대한 최적화 전략을 파기 시작하기 전에 집중하십시오.


정규식을 사용할 때 알아야 할 몇 가지 사항을 다루기 때문에 +1; 그러나 내부를 알 필요가 없다는 판단에 동의하지 않습니다. 드릴링의 경우, 당신은 전적으로 옳습니다. 컴퓨터에서는 처음에 생각하는 것보다 빨리 C ++ (컴파일러), 웹 서버 (HTTP) 또는 정규식 (자동 이론)이든 응용 프로그램을 마스터하기 위해 내부를 이해해야 할 시점에 도달했습니다. . 내가 전문가가되는 시점이 아니라 기본 원칙을 잘 이해하는 것이 종종 배우는 가장 빠른 방법입니다.
Felix Dombek

3
@Felix : 우리는 실제로 동의한다고 생각합니다. 나는 말했다 초보자 응용 프로그램 이없는 보통 도구가 사용하기 위해 어떻게 작동하는지 이해 할 필요. 그 족제비 단어는 의도적이었습니다. 예를 들어, 여행사 나 도구를 능숙하게 사용하려면 최소한 내부 도구에 대한 정보를 이해하면 도구의 성능이 저하되는 위치를 정확하게 예측할 수 있습니다.
Eric Lippert

흠, 나는 다소 동의하지 않을 것입니다. 내가 만든 가장 유용한 비즈니스 프로그램 중 일부는 문제를 효율적으로 해결하기 위해 lexx 및 yacc에서 배운 이론을 사용했습니다. 당신은 옳습니다. 완전한 phd 수준의 이해는 필요하지 않습니다. 블로그 게시물을 읽어야합니다. 가장 흥미로운 것 같습니다.
스펜서 Rathbun

당신은 정규 표현식 정규없는 말 -하지만 나는 세상의 생각 정기적 이름으로 그것과 일치하는 표현으로 언급했다 - 예를 들어, 정규 표현식 "[0-9]{3}"있는 세 자리 번호와 일치 할 수 있으며, 세 자리 숫자 480은 일반에 대한 예입니다 일치하는 표현.
구성자

1
@configurator : "일반적인"언어는 정의상 유한 오토 마톤으로 인식 할 수있는 언어입니다. 모든 정규 언어는 조합, 대안, 범주 및 Kleene Star로만 구성된 "정규 표현"을 특징으로 할 수 있습니다. 그러나 오늘날 대부분의 "정규 표현"엔진은 일반 언어보다 더 복잡한 언어를 인식합니다. 예를 들어, "올바로 일치하는 괄호가있는 문장"의 언어는 규칙적이지 않지만 일부 정규식 엔진의 "정규 표현식"과 일치시킬 수 있습니다.
Eric Lippert

6

도대체 어떻게해야합니까?

새로운 것처럼 :

10 Study
20 Practice
30 goto 10

연구

대부분의 성공적인 교사는 먼저 과목에 약간의 배경 지식을 제공함으로써 어떤 과목을 가르치기 시작합니다. 배우고있는 내용과 배우는 이유 를 이해하는 것이 중요 합니다.

모든 문자열 일치

정규 표현식은 텍스트에서 패턴을 일치시키는 수단입니다. 그것은 다른 많은 프로그래밍 언어에 통합 된 선언적 언어입니다.

나는 정규 표현식을 표현하는 데 유용는 선언적 언어의 것을 강조하고 싶습니다 무엇 에 맞게 문자열,하지만 그들은 어떤 식 으로든 표현으로하지 않는 방법 프로그램이 일치하는 것에 대해 이동하는 것입니다. 이러한 이유로 다른 RegEx 파서를 사용하여 동일한 프로그래밍 언어에서 정규식을 매우 빠르고 매우 느리게 사용할 수 있습니다.

정규 표현식을 작성하는 이유는 대부분의 프로그래밍 언어를 작성하는 경우와 같습니다. 프로그래머는 동일한 복잡한 작업을 반복해서 수행하고 더 간단한 코드 작성 방법을 원한다고 결정했습니다.

어떤 사람들은 나의 이전 문장에 대해 다음과 같은 내용으로 무언가를 말함으로써 불평 할 것입니다.

RegEx는 프로그램을 단순하게 만들지 않습니다.

사실이야

RegEx 프로그램을 더 단순 하게 만들지 않으며 RegEx는 프로그램을 간단 하게 작성 합니다. 모든 올바른 사례가 올바르게 일치하고 모든 잘못된 경우가 일치하지 않도록 테스트를 철저히 수행해야합니다. "모두"를 테스트하는 것은 정말 어렵고 복잡한 패턴으로 "가장 많이"를 테스트하는 것은 정말 어렵습니다. 최악의 경우, 여전히 "일부"사례를 테스트해야합니다.

브라우저에서 쉽게 테스트 할 수 있고 RegEx 리터럴을 사용하는 동안 문자열 이스케이프를 수행 할 필요가 없기 때문에 JavaScript의 RegEx 엔진을 엄격하게 선택한 몇 가지 예를 통합 할 수 있습니다.

일반 문자열 일치를 수행하면 한 문자열 값을 다른 문자열 값과 비교하여 테스트합니다. 그것들은 어느 곳에서나 올 수 있지만 결국 두 문자열을 서로 비교해야합니다.

if ( 'foo' == 'bar' ) doSomething();

이 예제 아무것도 하지 않기 때문에 짜증납니다 .

if ( foo == 'bar' ) doSomething();

훨씬 낫다; 지금, 우리는 실제로 어떤 일이 이루어질 것인지 미리 알지 못합니다. 이제 사용자 입력을 받아 들일 수 있습니다.

if ( prompt( 'Say "bar" to do something.' ) == 'bar' ) doSomething();

훌륭하고, 이제는 사용자가 입력 할 수 있으며 bar, "bar"작동하지 않거나 "BAR"이 작동하지 않거나 BRA100 번 입력했지만 아무 일도 일어나지 않는다고 사용자로부터 버그 보고서를받을 때까지 어떤 일 이 발생합니다.

맞춤법 오류와 추가 문자를 무시 'bar' != 'BAR'하고 프로그래머는 문자가 잘못된 경우를 테스트하는 방법을 고려해야합니다.

간단한 해결책을 사용하십시오 toLowerCase. 훌륭하게 작동하지만 일치 할 때 미국 영어보다 영국 영어를 사용하는 사용자는 something == 'color'어떻습니까? 이제 일치해야합니다 something == 'color' || somthing == 'colour'.

짧고 간단한 패턴은 긴 반복 코드로 매우 빠르게 변환됩니다.

색상 예는 다음과 간단히 일치 할 수 있습니다.

/colou?r/.test( something )

정규 표현식의 기본 사항을 제대로 이해하면 휠을 재발 명하는 데 걸리는 시간을 크게 줄일 수 있습니다.

공부할 곳

정규식을 구현하는 대부분의 언어에는 해당 언어 내에서 정규식을 사용하는 특정 구문에 사용할 수있는 리소스가 하나 이상 있습니다. 에 대한 하나의 자바 스크립트는 MDN에서 찾을 수 있습니다

읽어.
그것의 모든.
그런 다음 다시 읽으십시오.

학습하는 데 시간이 걸리고 투자로 생각하십시오. RegEx를 배우는 데 1 시간이 걸리면 다음에 문자열 패턴 일치를 수행해야 할 때 1 시간이 절약되고 그 다음에 다음 시간에는 1 시간이 절약됩니다.

연습

RegEx에 대한 모든 내용을 읽은 후에는 대부분 이해하지 못할 것입니다. 당신이 실제로하지 않을 때문이다 하고 그것으로 아무것도.

이 예제에서 JS를 선택한 이유를 언급했지만 브라우저에서 엉망으로 만들 것을 권장합니다. 빠르고, URL 표시 줄에서 바로 할 수 있습니다.

JS에는 RegEx를 사용하는 몇 가지 다른 간단한 방법이 있습니다.

string.match( regex )
regex.exec( string )
regex.test( string )

다음과 같은 간단한 것으로 시작하십시오.

javascript:'color'.match(/colou?r/);

문에 발을 넣는 쉬운 방법입니다. 그것을 가지고 놀고, 어떤 것이 일치하는지, 그렇지 않은 것을 보아라.

실습에 빠져 있으면 계속하십시오 30. 자세한 내용을 읽으려면 읽어야하지만 배운 내용을 실제로 이해하려면 연습해야합니다.


브라우저에서 JavaScript를 엉망으로 만드는 것을 추천하는 +1
John Tobler

5

Brian Kernighan은 Beautiful Code 책에 간단한 정규식 프로세서를 작성합니다 . 나는 당신이 리소스를 찾고 있지 않다는 것을 알고 있지만 내부에서 기본 구현 을 보는 것이 도움이 될 수 있습니다.


언급 된 "정규 프로세서"는 실제로 분리를 구현하지 않으며, 주어진 접근 방식을 사용하면이를 추가하기가 매우 어렵습니다. 나는 책을 좋아하지만 이것은 내가 실망한 것입니다.
Felix Dombek

4

정상적인 개발에서 디버깅 코드는 매우 유용한 통찰력을 제공 할 수 있습니다. 정규 표현식은 다르지 않습니다. 따라서 광고처럼 들릴 위험이 있으므로 RegexBuddy를 얻으 십시오 . 표현식과 입력 문자열을 처리 할 때 엔진이 수행하는 작업을 시각적으로 표시하는 훌륭한 도구가 있습니다.


1
+1, "Regex Hero"도 좋습니다 : regexhero.net/tester
Angelo

Regexbuddy는 내가 가장 좋아하는 도구 중 하나입니다. 정규식을 생성 할 때 즉시 테스트 할 수 있으므로 트리 뷰를 보는 것이 매우 유용합니다. 나는 그것을 사용하여 배우려고하지 않고 훨씬 더 많은 정규 표현식을 배웠습니다.
차오

1
나는 항상 RegexBuddy가 흥미 롭다는 것을 알았지 만 그것을 사는 것을 싫어합니다. 기본 정규식 테스트에는 다른 많은 유틸리티가 있습니다. 도구가 적지 만 정규식에 대한 텍스트 설명을 참조하십시오. Regex Hero의 유료 버전도 마찬가지입니다. RegexBuddy의 고유 한 특징 중 하나는 Regex Debugger입니다. 이는 Regex Debugger입니다. 각 문자의 수락 또는 거부와 각 역 추적 세부 사항은 크고 복잡한 regex를 디버깅 할 때 실제로 도움이 될 수 있습니다. 나는 그것을하는 다른 도구를 보지 못했습니다.
Kevin Cathcart

3

정규 표현식은 매우 빠르게 복잡해질 수 있으므로 자습서를 사용하여 학습을 시작하는 것이 좋습니다. 가장 간단한 정규식 형식은 검색하려는 내용을 나타내는 문자열입니다. 불행히도, 특수 검색 규칙을 정의하려면 특정 문자가 필요하며 이러한 문자를 이스케이프하거나 유효하지 않거나 잘못된 정규식을 작성해야합니다.

내 충고는 당신이 찾고있는 것의 예에서 시작하여 그것을 피하는 것입니다. 다시 말해, 괄호 안에있는 것을 찾고 있다면 검색중인 텍스트에서 그러한 문자열 중 하나를 예로 들어 보겠습니다. (this is an example of something you'd want to find)

리터럴 문자를 검색 할 수 있도록 문자를 이스케이프하여 시작하십시오. \(this is an example of something you'd want to find\)

테스트하고 예제를 올바르게 찾는 지 확인하십시오. 그런 다음 표현식을 일반화하여 찾은 예제뿐만 아니라 그러한 텍스트를 찾으십시오. 따라서 다음과 같이됩니다. \([^)]*\) (0을 포함하여 여러 번 발생하는 경우 ""가 아닌 문자를 의미합니다).

다시 테스트하고 예제뿐만 아니라 다른 사람들도 좋아하는지 확인하십시오. 인터넷에서보다 복잡하지만 빈번한 정규 표현식을 검색하고 기존 정규 표현식으로 패치하여 모든 가능성에 대해 걱정할 필요가 없습니다.

그게 다야. 그리고 오, 배우고 사랑합니다 \ Q ... \ E. 대부분의 정규 표현식 언어에서 \ Q는 리터럴 패턴의 시작을 나타내고 \ E는 특히 정교한 패턴 검색을 처리해야하고 패턴을 이스케이프 처리하는 방법을 모르는 경우를 나타냅니다. 그것은 두 번 이상 내 목숨을 구했습니다.


3

간단한 질문에 대한 간단한 답변을 드리겠습니다. 먼저 정규식 (RegEx)이 무엇인지, 무엇을하고 무엇을 사용하는지 이해해야합니다. 그런 다음 시작하기에 좋은 도구입니다.

  1. 무엇입니까? RegEx는 패턴 일치를 표현하는 언어입니다. 즉,이를 사용하면 텍스트에서 패턴을 인식하거나 찾는 문자 조합을 만들 수 있습니다. 이것이 어떻게 유용합니까? 프로그래밍에서 컴퓨터에 일부 소스 (사용자 입력, 웹 페이지 등)의 텍스트를 일치 시키도록하고 특정 텍스트 패턴이 포함되어 있는지 여부를 감지 할 수 있습니다. 예를 들어, 마침표 (.)는 문자 또는 숫자를 나타냅니다. 중괄호 안의 숫자는 반복 횟수를 나타내므로 ". {1,30}"은 1 ~ 30 회 반복되는 모든 문자를 나타냅니다. 즉, 빈 문자열을 가질 수 없으며 30보다 길 수 없습니다 문자. 그리고 거기서부터 계속됩니다.

  2. 학습을 시작하는 방법? 내가 본 최고의 도구는 Expresso 이지만 Windows 전용입니다. 표현식에 추가하려는 요소를 클릭하는 매우 광범위한 GUI가 있으며, 테스터는 다양한 입력과 비교하여 결과를 확인합니다. 나는 Mac에서 좋은 것을 보지 못했지만 (VMWare에서 Windows를 실행하고 있으므로 실제로 Mac 버전이 필요하지 않음) Linux를 찾는 데 많은 시간을 소비하지 않았습니다.


1
Expresso에 대한 팁을 주셔서 감사합니다. 나는 그것을 시험해 보았고 굉장하다!
Jim In Texas

3

좋은 참고 자료 외에도 실제로 배우는 방법 은 훌륭한 학습 도구를 사용하는 것입니다. 하나는 오픈 소스 Vim 편집기를 사용하고 있으며 두 가지 옵션이 설정되어 있습니다.

  1. : set incsearch ... 명령 줄에 검색 패턴을 입력하면 편집기가 즉시 일치하는 내용을 강조 표시하는 첫 번째 텍스트로 이동합니다. 더 이상 일치하지 않는 것을 입력하면 Vim은 시작했을 때 커서를 뒤로 이동시킵니다.
  2. : set hlsearch ... 현재 RE 검색과 일치하는 모든 텍스트에 강조 표시된 배경을 표시하도록 Vim에 지시합니다.

다른 하나는 무료 도구 호출 RegExCoach 를 사용하는 입니다. 검색하려는 텍스트를 붙여 넣은 다음 다른 창에서 정규식을 개발합니다. Vim과 마찬가지로 성공적인 경기를 강조합니다.


RegExCoach는 이제 쉐어웨어입니다. 복잡한 Perl 스타일 RE 개발에 매우 ​​도움이되었습니다.
Firstrock

2

기본 문자열 비교로 시작합니다. 매우 쉽지만 강력하지는 않습니다.

다음으로, "greek"와 "GreeK"가 같은지 비교하기 위해 대소 문자를 구분하지 않는 비교가 필요합니다. 이것은 조금 더 강력합니다.

언젠가 철자에 약간의 차이가있어 두 단어가 동등하게 비교되는 것을 막지 않아야합니다. 즉 "organize"와 "organize"는 동등하게 비교해야합니다. 당신은 앉아서 이것을하는 코드를 작성하고 행복합니다.

조금 더 추상화하고 "ize"로 끝나는 모든 단어가 영국 철자법에서 형제들과 동등하게 비교되기를 원할 때까지. 또는 일부 문자열을 특정 횟수만큼 반복합니다. 그리고 물론, 당신은 모든 것을 결합해야합니다.

등등. 마지막으로 모든 문자가 자신을 나타내는 것은 아닙니다. 다른 것은 정규 표현식이 아닙니다. 문자열 집합에 대한 설명으로 볼 수 있습니다.

그런 다음 상당히 쉽고 다음과 같은 3 가지 기본 원칙을 따릅니다.

기본 정규 표현식이 있습니다. 자체를 나타내는 문자, 문자 클래스, 대문자의 경우 \ d 또는 \ p {Lu}와 같은 문자 클래스의 경우 편리하지 않은 약어입니다.

r1과 r2가 정규 표현식이면 r1r2 r1 | r2 (r1)도 있습니다.

마지막으로 반복 수정 자 : r? r * r + r {n, m}

이것이 가장 알아야 할 사항입니다. 필요할 때 조회 할 수있는 모든 것


2

두 가지 좋은 답변은 정규 표현식의 이론을 배우고 실천하는 것입니다. 또한 진지한 경우 도움이되는 훌륭한 시각적 정규식 도구를 사용하는 것이 좋습니다.

예를 들어 RegexBuddy 에는 정규 디버그 실행을 단계별로 안내하는 시각적 디버그 모드가 있으며 각 단계에서 정규식 엔진이 수행하는 작업을 강조 표시 및 설명 텍스트를 통해 표시합니다. 있어 이 디버깅 시연 동영상 사이트에가.



1

저에게있어, 정규식이 무엇을 만들어 내는지 알면 정말 도움이되고 인생을 더 잘 이해하는데 도움이되었습니다.

이를 위해 Emacs에서 대상 텍스트가있는 파일을 연 다음 isearch-forward-regexp명령 을 사용합니다 . 정규 표현식을 입력하면 Emacs가 일치하는 항목 ( "isearch"부분)을 표시합니다.

명령을 실행하려면 Emacs에서을 사용할 수 있습니다 <ESC>xisearch-forward-regexp.


1

저는 어휘 분석기와 파서를 구축하는 데 사용되는 flex와 bison을 배워 정규 표현을 배웠습니다. 정규 표현식이 없으면 파서를 가질 수 없었고, 책 lexx와 yacc 는 너무 빨리 움직이지 않고 이론을 걷는 데 엄청나게 좋습니다.

기본적으로 오늘날 모든 정규식 엔진은 동일한 원칙을 따릅니다. 그것들은 모두 유한 한 상태 머신 이며, 만약 당신이 정말로 그것을 이해했다면, 당신은 당신이 작성하는 거의 모든 코드를 사용할 수 있습니다. 그것은 재귀를 배우는 것과 비슷합니다. 일단 그것을 얻으면, 본능적으로 문제에 적용합니다. 올바른 도구로 쉽게 해결할 수 있지만 도구 없이는 매우 어렵습니다.

정규 표현식과 비교하여 lexx와 yacc를 배우는 또 다른 점은 내부적으로 어떻게 작동 하는지 배우는 것 입니다. 프로그램의 미래 전망, 경기 종료 이유, 데이터 보유 방법 등. 포인터를 이해하는 것은 절대적으로 필요한 일이지만, lexx와 yacc를 받고 처음부터 살펴보면 요청한 모든 내용을 배우고 나머지 경력을위한 강력한 도구를 갖게됩니다.

질문 에는 학습을위한 많은 자료와 제가 함께 던진 플렉스 스켈레톤이 포함됩니다.


1

더 이상, 먼저 문제를 해결하고 문자열을 "토큰 화"하는 쉬운 방법이 없는지 확인하려고합니다.

하나를 찾을 수 없으면 문자열에서 원하는 것을 일치시키지 않는 문제로 간주합니다. 대신 원하지 않는 것과 일치하지 않는 문제입니다. 이것은 대부분 정규 표현식이 욕심 많기 때문입니다. 그러나 그것은 내가 원하는 것을 얻는 접근 방식으로 나에게 도움이되었습니다.

예를 들면 다음과 같습니다.

string = "Sep 22 19:57:38 host fcron[9137]: \
          Job fbsetbg -r $HOME/backgrounds/ \
          started for user user (pid 9138)"

분과 일치 시키려면 :

string.match /^\w+\s\d+\s\d+:(\d+):\d+\s\w+\s/ # correct but bad
string.match /\d+:([^:]+):\d+/                 # correct and good

다른 모든 것들과 함께 시간을 찾으려고 노력하는 대신 뚜렷한 경계를 찾으십시오.

예제는 약간 고안되었지만, 내가 생각해 낼 수있는 모든 것입니다.


1

내가 사용한 한 가지 접근 방식은 구문 업데이트가 필요한 오픈 소스 프로젝트를 찾은 다음 점점 더 복잡한 sed 스크립트를 작성하는 것이 었습니다.이 스크립트는 많은 정규식으로 구성되었습니다.

스크립트는 각 오픈 소스 프로젝트에서 다양한 파일에 대해 실행해야했습니다. 그런 다음 스타일이 다른 여러 프로젝트에 대해 실행하십시오. 나는 매우 간단한 것으로 시작하여 %s/before/after 너무 많은 경우와 일치한다는 것을 알았습니다. 이를 막기 위해 더 많은 것을 추가했습니다. 그런 다음 다른 변경이 필요한 다른 구문 스타일을 사용하여 다른 프로젝트를 찾았습니다.

결국 나는 결국

  • 정규 표현식에 대한 훌륭한 기술과 지식
  • sed를 가진 좋은 기술
  • 많은 오픈 소스 프로젝트를 돕는
  • 내 github 프로필에 많은 기여 활동이 표시됩니다.
  • 가상 툴 벨트를위한 또 다른 좋은 '스위스-아미 나이프'툴

이 접근 방식에서 도움이 필요했습니다

  • 부정 행위없이 실제 목표를 달성
  • 더 큰 동기 부여를 통해 더 큰 목표의 일부로 (정규식) 기술을 사용하십시오.
  • 다른 사람의 코드를 변경하고 변경 사항을 검토함으로써 내가 배운 기술의 증거를 보여줄 수 있습니다.

루비, 자바 스크립트 등 다양한 언어를위한 사이트가 많이 있으며,이를 통해 표현과 샘플 텍스트로 즉시 만족할 수 있습니다. 이것들은:

한 사이트에서 여러 언어로 정규 표현식

경기 그룹에 초점 :


0

나는 곱셈 테이블을 배우는 것과 비슷한 정규 표현식을 배우는 것을 발견했습니다. 그렇습니다. 그 뒤에있는 아이디어를 이해해야하지만 궁극적으로 자주 반복해야합니다.

배우면서 나는 하루에 몇 번 정규식 운동을한다는 ​​목표를 세웠습니다. 실제로, 이것은 하루에 한 번 이상을 의미했습니다. 화면에서 문자열이나 텍스트를 보려고 시도하고 "여기에서 모든 이메일 주소를 가져올 수 있습니까?" '코드'라는 단어는 명사 대신 동사로 사용됩니다. "

몇 주 동안 그렇게하면 실제로 보상을 받았으며 물론 정기적 인 검토와 새로 고침이 필요합니다. 나는 하나에 대한 예정입니다.

실시간으로 정규식을 테스트 할 수 있기 때문에이 온라인 도구도 유용하다는 것을 알았습니다. http://www.gethifi.com/tools/regex

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.