먼저 두 개의 새 특수 문자를 쓸 수 있습니다. ?는 앞 패턴이 0 또는 1번 나온다는 뜻입니다. 단순 정규식을 쓰면 \{0,1\}에 해당합니다. +는 앞 패턴이 1 번 이상 나온다는 뜻입니다. 따라서 \{1,\}에 해당합니다.
지금까지 설명만으로는 확장 정규식이 위의 두 가지 ?와 +이 추가된 것만 빼고는 전혀 쓸모없어 보일 것입니다. 아래의 예를 보면 생각이 바뀔지도 모릅니다.
확장 정규식에서 변화된 것은 바로 (, |, ) 문자입니다. 이들 문자는 어떤 집합을 정의할 수 있습니다. 즉 정규식 (A|B|C)는 A, B, C에 매치되는 표현입니다. 얼핏 보면 [ABC]과 같아 보이지만 엄연히 다릅니다. 괄호와 |를 쓸 때의 A, B, C는 단순히 문자가 아니라 A, B, C 자체도 다른 정규식일 될 수 있습니다. 예를 들어 `From: ' 또는 `Subject: '라는 단어가 들어간 줄을 찾으려면 다음과 같이 egrep을 쓸 수 있습니다:
% egrep '^(From|Subject): ' /usr/spool/mail/$USER
만약 단순 정규식을 쓴다면 쉽게 할 방법이 없습니다. 아마도
^[FS][ru][ob][mj]e*c*t*:
처럼 해야 할 것입니다. 그러나 불안전한 방법입니다. 예를 들어 이 방법을 쓸 경우 `Sromeet: '에도 매치되어버릴 수 있습니다. 확장 정규식에서는 \<, \>도 쓸 수 없습니다. 그러나 단어(word) 단위로 찾기 위해 다른 방법을 쓸 수 있습니다. 단어 `the'만을 찾으려면 (^| )the([^a-z]|%)를 쓸 수 있습니다.
예를 들어 다음의 세 가지 경우 모두 매치되는, 확장 정규식을 만들어 봅시다:
이는 다음의 두 가지로 만들어 볼 수 있습니다.
후자의 경우가 좀 더 정확한 표현입니다.
단순 정규식에서 \{, \[, \(, \<, \1이 확장 정규식에서 동작하지 않는 이유를 설명하겠습니다. 사실 \{...\}, \<...\>는 확장 정규식에 추가될 수도 있지만 \(...\)는 불가능합니다.
이유는 간단합니다. 만약 (가 특수 문자라면 \(는 일반 문자가 되어야 하기 때문입니다. 이는 단순 정규식과 반대지만 의미는 통합니다. 예를 들어 단순 정규식에서는 (는 일반 문자지만 \(는 특수 문자가 됩니다. 따라서 단순 정규식의 규칙을 지키면서 기능을 추가할 수 없습니다.
따라서 GNU Emacs와 같은 프로그램은 두 기능을 한번에 쓰지 않는다는 가정 아래에 단순 정규식과 확장 정규식을 동시에 지원합니다.