Regular Expressions정규 표현식 시작하기


비고

많은 프로그래머에게 정규 표현식 은 어떤 종류의 텍스트 구문 분석 상황을 해결하기 위해 던지는 일종의 마법의 검입니다. 그러나이 도구는 마술처럼 쓸모가 없으며, 기능이 훌륭하더라도 완벽한 기능의 프로그래밍 언어는 아닙니다 ( , Turing-complete는 아닙니다 ).

'정규 표현식'은 무엇을 의미합니까?

정규식비 결정적 유한 자동 기계 (NFA)로 해결할 수있는 정규 문법에 의해 정의 된 언어를 표현하며, 여기서 일치는 상태로 나타납니다.

정규 문법촘스키 계층 구조 로 표현되는 가장 간단한 문법입니다.

촘스키의 계층 구조

간단히 말하면, 정규 언어는 NFA가 표현할 수있는 것으로 시각적으로 표현되며, 여기 NFA의 간단한 예가 있습니다.

NFA 예제

정규 표현식 언어는 이러한 자동화의 텍스트 표현입니다. 마지막 예제는 다음 정규식으로 표현됩니다.

^[01]*1$

0 또는 1 시작하는 문자열이 0 회 이상 반복되고 1 끝나는 문자열을 찾습니다. 즉, 이진 표현에서 홀수를 매치하는 정규 표현식입니다.

모든 정규식은 실제로 정규 문법입니까?

사실 그들은 그렇지 않습니다. 많은 regex 엔진이 개선되어 누적 된 오토마타를 사용하고 있으며, 누적 될 수 있고 실행 중일 때 정보를 팝업 할 수 있습니다. 이러한 오토마타는 Chomsky Hierarchy에서 context-free grammars 를 정의합니다. 비정규 정규식 에서 이들을 사용하는 가장 일반적인 방법은 괄호 매칭에 재귀 패턴을 사용하는 것입니다.

다음과 같은 재귀 적 정규 표현식 (괄호와 일치)은 이러한 구현의 예입니다.

{((?>[^\(\)]+|(?R))*)}

(이 예제는 파이썬의 re 엔진에서는 작동하지 않지만 regex 엔진 이나 PCRE 엔진 에서는 작동하지 않습니다).

자원

정규 표현식의 이론에 대한 자세한 내용은 MIT에서 제공하는 다음과 같은 코스를 참조하십시오.

복잡한 정규식을 작성하거나 디버깅 할 때 debuggex 사이트 와 같이 자동으로 정규식을 시각화 할 수있는 온라인 도구가 있습니다.

버전

PCRE

번역 출시 됨
2 2015-01-05
1 1997-06-01

다음에 의해 사용됨 : PHP 4.2.0 (이상), Delphi XE (이상), Julia , Notepad ++

번역 출시 됨
1 1987-12-18
2 1988-06-05
1989-10-18
4 1991-03-21
5 1994-10-17
6 2009-07-28

.그물

번역 출시 됨
1 2002-02-13
4 2010-04-12

언어 : C #

자바

번역 출시 됨
4 2002-02-06
5 2004-10-04
7 2011 년 7 월 7 일
SE8 2014-03-18

자바 스크립트

번역 출시 됨
1.2 1997-06-11
1.8.5 2010-07-27

파이썬

번역 출시 됨
1.4 1996-10-25
2.0 2000-10-16
3.0 2008-12-03
3.5.2 2016-06-07

오니 구루 마

번역 출시 됨
머리 글자 2002-02-25
5.9.6 2014-12-12
Onigmo 2015-01-20

후원

번역 출시 됨
0 1999-12-14
1.61.0 2016-05-13

POSIX

번역 출시 됨
BRE 1997-01-01
오히려 2008-01-01

언어 : 배시

캐릭터 가이드

일부 구문 요소는 표현식에 따라 다른 동작을합니다.

통사론 기술
? 앞의 문자 또는 하위 표현식을 0 번 또는 1 번 일치시킵니다. 또한 비 캡처 그룹 및 명명 된 캡처 그룹에 사용됩니다.
* 앞의 문자 또는 하위 표현식을 0 번 이상 찾습니다.
+ 선행 문자 또는 부 표현식을 1 회 이상 일치시킵니다.
{n} 앞의 문자 또는 하위 표현식을 정확하게 n 번 매치하십시오.
{min,} 앞의 문자 또는 하위 표현식을 최소 이상 일치시킵니다.
{,max} 앞의 문자 또는 하위 표현식을 최대 또는 더 적은 횟수와 일치시킵니다.
{min,max} 앞의 문자 또는 부분 표현식을 적어도 최소 시간에서 max 시간 max 일치시킵니다.
- 대괄호 사이에 포함하는 경우 표시 to ; 예 : [3-6]은 문자 3, 4, 5 또는 6과 일치합니다.
^ 문자열 시작 (또는 다중 행 /m 옵션이 지정된 경우 행의 시작) 또는 옵션 목록을 무효화합니다 (즉, 대괄호 [] 안에있는 경우)
$ 문자열의 끝 (또는 다중 행 /m 옵션이 지정된 경우 행의 끝).
( ... ) 그룹 서브 표현식, 동일한 정규 표현식 내에서 나중에 사용할 수있는 특수 변수 ( \1 , \2 등)의 일치하는 내용 캡처 (예 : (\w+)\s\1\s 는 단어 반복과 일치 함)
(?<name> ... ) 그룹 서브 표현식을 그룹화하고 명명 된 그룹에서이를 캡처합니다.
(?: ... ) 캡처하지 않고 하위 표현식을 그룹화합니다.
. 줄 바꿈 ( \n , 일반적으로 \r )을 제외한 모든 문자와 일치합니다.
[ ... ] 이 괄호 사이에있는 문자는 한 번 일치시켜야합니다. NB : ^ 개방 브래킷 다음은이 효과를 무효화. - 대괄호 안에 들어가면 값의 범위를 지정할 수 있습니다 (첫 번째 또는 마지막 문자가 아닌 경우 일반 대시를 나타냄).
\ 다음 문자를 이스케이프 처리합니다. 또한 메타 시퀀스에서 사용되는 특별한 의미의 정규 표현식 토큰.
\$ 달러 (즉, 이스케이프 된 특수 문자)
\( 여는 괄호 (즉, 이스케이프 된 특수 문자)
\) 닫는 괄호 (즉, 이스케이프 된 특수 문자)
\* 별표 (즉, 이스케이프 된 특수 문자)
\. 도트 (즉, 이스케이프 된 특수 문자)
\? 물음표 (즉, 이스케이프 된 특수 문자)
\[ 왼쪽 (열린) 대괄호 (즉, 이스케이프 된 특수 문자)
\\ 백 슬래시 (즉, 이스케이프 된 특수 문자)
\] 오른쪽 (닫기) 대괄호 (즉, 이스케이프 된 특수 문자)
\^ 캐럿 (즉, 이스케이프 된 특수 문자)
\{ 왼쪽 (열린) 중괄호 / 중괄호 (즉, 이스케이프 된 특수 문자)
\| 파이프 (즉, 이스케이프 된 특수 문자)
\} 오른쪽 (닫기) 중괄호 / 중괄호 (즉, 이스케이프 된 특수 문자)
\+ 플러스 (즉, 이스케이프 된 특수 문자)
\A 문자열의 시작
\Z 문자열의 끝
\z 끈의 절대
\b 단어 (영숫자 순서) 경계
\1 , \2 이전에 일치 한 하위 표현식에 대한 역 참조는 () 그룹화되고 \1 은 첫 번째 일치를 의미하고 \2 는 두 번째 일치를 의미합니다.
[\b] 백 스페이스 - \b 가 문자 클래스 ( [] ) 안에있을 때 백 스페이스와 일치합니다.
\B negated \b - 두 단어 문자 사이의 모든 위치와 두 단어가 아닌 문자 사이의 모든 위치와 일치합니다.
\D 비 디지트
\d 손가락
\e 탈출
\f 양식 사료
\n 줄 바꿈
\r 캐리지 리턴
\S 비 공백
\s 공백
\t
\v 수직 탭
\W 비 단어
\w 단어 (즉, 영숫자)
{ ... } 명명 된 문자 집합
| 또는; 즉 선행 옵션과 선행 옵션을 묘사합니다.