정규 표현식

[[파일:The river effect in justified text.jpg|섬네일|오른쪽|노란색 강조 부분은 다음 정규식을 사용했을 때 매치된 것이다.sxhl|2=ragel|1=(?` | `(??@\^_`{|}~-]` | 구두점 |- | `[:space:]` | | `\s` | `\_s` (단순히 줄 끝에 추가) | `[ \t\r\n\v\f]` | 공백 문자 |- | | | `\S` | | `[^ \t\r\n\v\f]` | 공백이 아닌 모든 문자 |- | `[:upper:]` | | | `\u` | `[A-Z]` | 대문자 |- | `[:xdigit:]` | | | `\x` | `[A-Fa-f0-9]` | 16진수 |}
## 펄과 PCRE
표현력과 (상대적으로) 양호한 가독성으로 인해 자바, 자바스크립트, 파이썬, 루비, 마이크로소프트의 닷넷 프레임워크, XML 스키마 등의 여러 수많은 유틸리티들과 프로그래밍 언어들은 펄의 정규식과 비슷한 문법을 채택하고 있다. Boost와 PHP와 같은 일부 언어들과 도구들은 여러 방식의 정규식을 지원한다. 펄 파생 정규식 구현체들은 완전히 동일한 것은 아니며 일반적으로 1994년에 출시된 펄 5.0의 기능의 하위 집합을 구현하고 있다. 펄은 종종 다른 언어에서 발견되는 기능들을 도입하고 있는데, 이를테면 펄 5.10은 PCRE와 파이썬에서 개발되는 문법 확장들을 구현한다.accessdate=January 8, 2012
# 이용
정규 표현식은 다양한 텍스트 처리 작업, 더 일반적으로 문자열 처리에 유용하며, 여기에서 데이터는 반드시 텍스트일 필요는 없다. 일반적으로 데이터 검증, 데이터 스크래핑(일반적으로 웹 스크래핑), 데이터 랭글링, 단순 파싱, 문법 강조 시스템 개발 등의 작업에 응용된다. 정규 표현식이 인터넷 검색 엔진에 유용할 수 있으나 전체 데이터베이스를 거쳐 이것들을 처리하기에는 정규 표현식의 복잡도와 설계에 따라 컴퓨터 자원을 과도하게 소비할 수 있다. 대개의 경우 시스템 관리자들이 정규 표현식 기반 쿼리를 내부적으로 수행할 수 있지만 대부분의 검색 엔진들은 대중에게 정규 표현식 지원을 제공하지 않는다.
# 예
특정 문법 규칙은 사용 중인 특정 구현체, 프로그래밍 언어, 라이브러리에 따라 다양하다. 또한 정규 표현식 구현체들의 기능은 소프트웨어 버전 간에도 다를 수 있다. 정규 표현식들은 예제 없이 설명과 이해를 동시에 하는 것은 어려울 수 있다. 아래에는 정규 표현식의 속성 중 일부의 기본적인 설명을 제시한다. 아래의 항목들은 예제에 사용된다.The character 'm' is not always required to specify a Perl match operation. For example, `m/[^abc]/` could also be rendered as `/[^abc]/`. The 'm' is only necessary if the user wishes to specify a match operation without using a forward-slash as the regex delimiter. Sometimes it is useful to specify an alternate regex delimiter in order to avoid "delimiter collision". See 'perldoc perlre' for more details. 메타문자 ;; 메타문자들의 열은 표현할 정규식을 지정한다. =~ m// ;; 펄에서 문자열을 '일치'시키려는 동작을 지정한다. =~ s/// ;; 펄에서 문자열을 '대체'시키려는 동작을 지정한다. 이 예제들에 사용된 문법과 규칙들은 다른 프로그래밍 환경에서와 일치한다.e.g., see *자바 in a Nutshell* — Page 213, *파이썬 Scripting for Computational Science* — Page 320, Programming PHP — Page 106 {| class="wikitable" ! 메타문자 ! 설명 ! 예시모든 if문은 true(참)을 반환한다 |- ! `.` | 일반적으로 새 줄을 제외한 모든 어떠한 문자열과도 일치한다. | $string1 = "Hello World\n"; if ($string1 =~ m/...../) { print "$string1 has length >= 5\n"; } **출력:**

Hello World
has length >= 5

|- ! `( )` | 일련의 패턴 요소들을 하나의 요소로 묶는다.
괄호 안의 패턴을 일치시킬 때 `$1`, `$2`, ... 중 하나를 사용할 수 있다. | $string1 = "Hello World\n"; if ($string1 =~ m/(H..).(o..)/) { print "We matched '$1' and '$2'\n"; } **출력:** We matched 'Hel' and 'o W' |- ! `+` | 1번 이상 발생하는 패턴과 일치시킨다. | $string1 = "Hello World\n"; if ($string1 =~ m/l+/) { print "There are one or more consecutive letter \"l\"'s in $string1\n"; } **출력:** There are one or more consecutive letter "l"'s in Hello World |- ! `?` | 0~1번 발생하는 패턴과 일치시킨다. | $string1 = "Hello World\n"; if ($string1 =~ m/H.?e/) { print "There is an 'H' and a 'e' separated by "; print "0-1 characters (Ex: He Hoe)\n"; } **출력:** There is an 'H' and a 'e' separated by 0-1 characters (Ex: He Hoe) |- ! `?` | | $string1 = "Hello World\n"; if ($string1 =~ m/(l.+?o)/) { print "The non-greedy match with 'l' followed by one or\n"; print "more characters is 'llo' rather than 'llo Wo'.\n"; } **출력:** The non-greedy match with 'l' followed by one or more characters is 'llo' rather than 'llo Wo'. |- ! `*` | 0번 이상 발생하는 패턴과 일치시킨다. | $string1 = "Hello World\n"; if ($string1 =~ m/el*o/) { print "There is an 'e' followed by zero to many "; print "'l' followed by 'o' (eo, elo, ello, elllo)\n"; } **출력:** There is an 'e' followed by zero to many 'l' followed by 'o' (eo, elo, ello, elllo) |- ! {M,N} | 최소 M번, 최대 N번 발생되는 패턴과 일치시킨다. | $string1 = "Hello World\n"; if ($string1 =~ m/l{1,2}/) { print "There exists a substring with at least 1 "; print "and at most 2 l's in $string1\n"; } **출력:** There exists a substring with at least 1 and at most 2 l's in Hello World |- ! `[...]` | 가능한 문자열의 집합과 일치시킨다. | $string1 = "Hello World\n"; if ($string1 =~ m/[aeiou]+/) { print "$string1 contains one or more vowels.\n"; } **출력:** Hello World contains one or more vowels. |- ! `|` | 가능성 있는 항목들을 구별하여 선택한다. | $string1 = "Hello World\n"; if ($string1 =~ m/(Hello|Hi|Pogo)/) { print "At least one of Hello, Hi, or Pogo is "; print "contained in $string1.\n"; } **출력:** At least one of Hello, Hi, or Pogo is contained in Hello World . |- ! `\b` | | $string1 = "Hello World\n"; if ($string1 =~ m/llo\b/) { print "There is a word that ends with 'llo'\n"; } **출력:** There is a word that ends with 'llo' |- ! `\w` | "_"를 포함한 영숫자를 일치시킨다. | $string1 = "Hello World\n"; if ($string1 =~ m/\w/) { print "There is at least one alphanumeric "; print "character in $string1 (A-Z, a-z, 0-9, _)\n"; } **출력:** There is at least one alphanumeric character in Hello World (A-Z, a-z, 0-9, _) |- ! `\W` | "_"를 제외하여 영숫자가 아닌 문자열들과 일치시킨다. | $string1 = "Hello World\n"; if ($string1 =~ m/\W/) { print "The space between Hello and "; print "World is not alphanumeric\n"; } **출력:** The space between Hello and World is not alphanumeric |- ! `\s` | 공백 문자와 일치시킨다. | $string1 = "Hello World\n"; if ($string1 =~ m/\s.*\s/) { print "There are TWO whitespace characters, which may"; print " be separated by other characters, in $string1"; } **출력:** There are TWO whitespace characters, which may be separated by other characters, in Hello World |- ! `\S` | 공백을 제외한 어떠한 것이든 일치시킨다. | $string1 = "Hello World\n"; if ($string1 =~ m/\S.*\S/) { print "There are TWO non-whitespace characters, which"; print " may be separated by other characters, in $string1"; } **출력:** There are TWO non-whitespace characters, which may be separated by other characters, in Hello World |- ! `\d` | 숫자를 일치시킨다. | $string1 = "99 bottles of beer on the wall."; if ($string1 =~ m/(\d+)/) { print "$1 is the first number in '$string1'\n"; } **출력:** 99 is the first number in '99 bottles of beer on the wall.' |- ! `\D` | 숫자가 아닌 항목을 일치시킨다. | $string1 = "Hello World\n"; if ($string1 =~ m/\D/) { print "There is at least one character in $string1"; print " that is not a digit.\n"; } **출력:** There is at least one character in Hello World that is not a digit. |- ! `^` | 줄이나 문자열의 시작점과 일치시킨다. | $string1 = "Hello World\n"; if ($string1 =~ m/^He/) { print "$string1 starts with the characters 'He'\n"; } **출력:** Hello World starts with the characters 'He' |- ! `$` | 줄이나 문자열의 끝과 일치시킨다. | $string1 = "Hello World\n"; if ($string1 =~ m/rld$/) { print "$string1 is a line or string "; print "that ends with 'rld'\n"; } **출력:** Hello World is a line or string that ends with 'rld' |- ! `\A` | 문자열의 시작점과 일치시킨다. (내부 줄이 아닌) | $string1 = "Hello\nWorld\n"; if ($string1 =~ m/\AH/) { print "$string1 is a string "; print "that starts with 'H'\n"; } **출력:** Hello World is a string that starts with 'H' |- ! `\z` | 문자열의 끝과 일치시킨다. (내부 줄이 아닌)url-status = | $string1 = "Hello\nWorld\n"; if ($string1 =~ m/d\n\z/) { print "$string1 is a string "; print "that ends with 'd\\\n'\n"; } **출력:** Hello World is a string that ends with 'd\n' |- ! `[^...]` | 괄호 안의 항목을 제외한 모든 문자열과 일치시킨다. | $string1 = "Hello World\n"; if ($string1 =~ m/[^abc]/) { print "$string1 contains a character other than "; print "a, b, and c\n"; } **출력:** Hello World contains a character other than a, b, and c |}