정규 표현식

정규 표현식이란?

정규란 문법을 의미한다. 정규 표현식이란 특정 문자 집합의 패턴을 기술 하는 표현식을 의미한다.

특정 패턴을 포함한 라인들을 찾고 싶을때 사용한다. 정규 표현식은 한 라인에서의 패턴 검색에 최적화 되어 있다. 여러 라인에 걸친 패턴 찾기는 적용되지 않는다.

쉘은 메타 데이터 문자를 프로그램에 넘겨주기 전에 확장한다. 이걸 막기 위해서는 정규 표현식에서 특수 문자들을 감싸 주어야 한다.

출처

  • 원본 아래 내용은 개인용으로 정리한 내용 입니다.

정규 표현식의 구조

3개의 중요한 부분으로 구성되어 있다.

'^#*'

Anchors '^'

라인안에서 패턴의 위치를 기술하는대 사용.

Character Sets '#'

한 위치에서 한개또는 여러개에 매칭되는 문자들

Modifiers '*'

문자셋이 몇번 반복되는지 기술.

Utility Regular Expression Type
vi Basic
sed Basic
grep Basic
csplit Basic
dbx Basic
dbxtool Basic
more Basic
ed Basic
expr Basic
lex Basic
pg Basic
nl Basic
rdist Basic
awk Extended
nawk Extended
egrep Extended
EMACS EMACS Regular Expressions
PERL PERL Regular Expressions

앵커 ^, $

라인의 시작과 끝을 기술하기 위해사용. 그외 위치에서 사용되면 그냥 문자열로 아무 의미가 없음

Pattern Matches
^A "A" at the beginning of a line
A$ "A" at the end of a line
A^ "A^" anywhere on a line
$A "$A" anywhere on a line
^^ "^" at the beginning of a line
$$ "$" at the end of a line$$

캐릭터셋

'.' 모든 문자를 의미

한글자만 있는 라인 매칭

^.$

문자열의 범위로 표현 [...]

  • 숫자 표현
^[0123456789]$
  • 하이픈을 사용하여 짧게 표현 가능
^[0-9]$
  • 문자열이 붙어 있으면 그 문자 중 아무거나
^[aeiou]$
  • 하이픈과 문자열 붙음을 응용
[A-Za-z0-9_]

'^' 을 사용해서 exception 을 표현

바로 앞에 "[" 문자가 없다면 "-", "]" 은 특수 의미를 가지지 않음

Regular Expression Matches
[] The characters "[]"
[0] The character "0"
[0-9] Any number
[^0-9] Any character other than a number
[-0-9] Any number or a "-"
[0-9-] Any number or a "-"
[^-0-9] Any character except a number or a "-"
[]0-9] Any number or a "]"
[0-9]] Any number followed by a "]"
[0-9-z] Any number, or any character between "9" and "z".
[0-9-a]] Any number, or a "-", a "a", or a "]"

Modifier

* 을 사용한 문자의 반복

  • 은 0개 또는 여러개가 반복된다는걸 의미 0개가 의미 없다고 생각 할 수 있지만 만약 라인 앞에 스페이스가 있거나 없을 경우 유용한다. " *" 또한 1개 이상의 숫자를 지정하고 싶다면 "[0-9][0-9]*" 로 표현 할 수 있다.

\ 백 슬래시

보통 백슬래시는 문자의 특별한 의미를 없애는대 사용된다. * , . 캐릭터를 매칭하고 싶다면 *, . 이렇게 하면된다. 하지만 감싸는 기호들 "<", ">", "{", "}", "(", ")", 또는 숫자 앞에 사용된다면 특별한 의미를 on 하는대 사용된다. 백슬래시에 두개의 의미가 있는 이유는 감싸는 기호들의 기능이 나중에 추가 되었기 때문이고 이전 코볼 코드들을 유지 하기 위해서 이다. 그냥 백슬래시가 진화했다라고 생각하자.

특정한 숫자 만큼의 반복

  • 4~8 사이의 소문자의 반복
echo "abc efgx" > old
sed 's/[a-z]\{4,8\}//' old
  • 0~255 까지 사용가능
  • 뒤에 숫자를 스킵하면 255까지
  • 뒤에 컴마와 숫자를 동시 스킵하면 앞 숫자와 캐릭터 반복이 일치해야함
  • Modifer 들은 *, \{1,5\} 들은 반드시 캐릭터 뒤에 따라와야지만 특별한 의미를 가짐
Regular Expression Matches
_
* Any line with an asterisk
* Any line with an asterisk
\ Any line with a backslash
^* Any line starting with an asterisk
^A* Any line
^A* Any line starting with an "A*"
^AA* Any line if it starts with one "A"
^AA*B Any line with one or more "A"'s followed by a "B"
^A{4,8}B Any line starting with 4, 5, 6, 7 or 8 "A"'s followed by a "B"
^A{4,}B Any line starting with 4 or more "A"'s followed by a "B"
^A{4}B Any line starting with "AAAAB"
{4,8} Any line with "{4,8}"
A{4,8} Any line with "A{4,8}"

\< > 을 사용해 단어 찾기

the 라는 단어를 찾는건 쉽지않다 왜냐하면 other 도 매칭되기 때문이다. 이때 \<[tT]he> 로 단어를 감싸면 the 만 검색된다. t 앞에는 뉴라인 또는 (문자, 숫자, )가 아닌 것만 허용된다. e 뒤에는(문자, 숫자, )가 아닌 것만 허용된다.

(, ) 그리고 \1 을 사용한 패턴기억

(문자)에 검색된 결과를 패턴 검색에 중복 사용 할수있다. - 중복 단어 검색

\([a-Z][a-Z]*\) \1

주의점

  • \<, > 은 vi 만 지원한다.
  • A.*B 를 할 경우 가장 긴 패턴에 매칭시킨다. 즉 "AABBAABBAAB" 전체가 매칭횐다.

확장 정규 표현식

egrep 또는 awk 의 경우 확장 정규 표현식을 지원한다. 확장 정규 표현식은 정규 표현식의 일부 기호들만 같은 의미이고 일부 기호들을 다른 의미로 사용한다. 예를들어 Send 또는 From 으로 시작하는 라인을 찾으라고 한다면 기존 정규식으로는 불가능 하지만 확장 정규 표현식에서는 가능하다. 각각 잘하는 패턴 매칭이 있고 상황에 따라 정규식 또는 확장 정규식을 사용하면 된다.

다른점

  • 확장 정규식에서 감싸는 기호들은 다른 의미를 가진다.
    • "\<", ">" 아무 의미가 없다.
    • "{", "}" 몇번 반복되는지를 의미한다. (범위가 아니라)
    • "(", ")" 아무 의미가 없다. "(..|..)" 을 or 로 사용한다.
    • "\digit" 기억하는 기능이 없음으로 참조도 필요 없다.
Regular Expression Class Type Meaning
. all Character Set A single character (except newline)
^ all Anchor Beginning of line
$ all Anchor End of line
[...] all Character Set Range of characters
* all Modifier zero or more duplicates
\< Basic Anchor Beginning of word
> Basic Anchor End of word
(..) Basic Backreference Remembers pattern
\1..\9 Basic Reference Recalls pattern
+ Extended Modifier One or more duplicates
? Extended Modifier Zero or one duplicate
{M,N} Extended Modifier M to N Duplicates
(...|...) Extended Anchor Shows alteration

POSIX characeter set

Character Group Meaning
[:alnum:] Alphanumeric
[:cntrl:] Control Character
[:lower:] Lower case character
[:space:] Whitespace
[:alpha:] Alphabetic
[:digit:] Digit
[:print:] Printable character
[:upper:] Upper Case Character
[:blank:] whitespace, tabs, etc.
[:graph:] Printable and visible characters
[:punct:] Punctuation
[:xdigit:] Extended Digit

Perl Extenstions

Class Type Meaning
\t Character Set tab
\n Character Set newline
\r Character Set return
\f Character Set form
\a Character Set alarm
\e Character Set escape
\033 Character Set octal
\x1B Character Set hex
\c[ Character Set control
\l Character Set lowercase
\u Character Set uppercase
\L Character Set lowercase
\U Character Set uppercase
\E Character Set end
\Q Character Set quote
\w Character Set Match a "word" character
\W Character Set Match a non-word character
\s Character Set Match a whitespace character
\S Character Set Match a non-whitespace character
\d Character Set Match a digit character
\D Character Set Match a non-digit character
\b Anchor Match a word boundary
\B Anchor Match a non-(word boundary)
\A Anchor Match only at beginning of string
\Z Anchor Match only at EOS, or before newline
\z Anchor Match only at end of string
\G Anchor Match only where previous m//g

Link