정규 표현식 구문 빠른 참조

이 체크리스트는 calibre의 대부분에서 사용 가능한 정규 표현식 엔진에서 가장 많이 사용되거나 기억하기 어려운 부분을 요약합니다.

문자 클래스

문자 클래스는 다양한 문자 그룹을 간결하게 표현하는 데 유용합니다.

예시:

표현

클래스

[a-z]

소문자. 악센트 기호와 합자가 포함되지 않음

[a-z0-9]

a부터 z까지의 소문자 또는 0부터 9까지의 숫자

[A-Za-z-]

대문자 또는 소문자, 또는 대시. 클래스에 대시를 포함하려면 문자 범위를 지정하는 하이픈과 혼동되지 않도록 처음이나 끝에 놓아야 합니다

[^0-9]

숫자를 제외한 모든 문자. 클래스 시작 부분에 놓인 캐럿(^)은 해당 클래스의 문자를 제외합니다 (보수 클래스)

[[a-z]--[aeiouy]]

소문자 자음. 클래스 안에 클래스를 포함할 수 있습니다. -- 문자는 뒤에 오는 것을 제외합니다

[\w--[\d_]]

모든 문자 (외국어 악센트 문자 포함). 약어 클래스는 클래스 안에서 사용할 수 있습니다

예시:

<[^<>]+> to select an HTML tag

약어 문자 클래스

표현

클래스

\d

숫자 (``[0-9]``와 동일)

\D

숫자가 아닌 모든 문자 (``[^0-9]``와 동일)

\w

악센트 기호와 합자가 포함된 영숫자 문자 ([a-zA-Z0-9])

\W

“단어가 아닌” 모든 문자

\s

공백, 줄바꿈 없는 공백, 탭, 캐리지 리턴

\S

“공백이 아닌” 모든 문자

.

줄바꿈을 제외한 모든 문자. 줄바꿈 문자를 포함하려면 “dot all” 체크박스를 사용하거나 (?s) 정규식 수정자를 사용하십시오.

한정자

한정자

한정자 앞의 표현식 출현 횟수

?

표현식의 0 또는 1회 출현. ``{0,1}``과 동일

+

표현식의 1회 이상 출현. ``{1,}``과 동일

*

표현식의 0, 1 또는 그 이상 출현. ``{0,}``과 동일

{n}

표현식의 정확히 n회 출현

{min,max}

최소값과 최대값(포함) 사이의 출현 횟수

{min,}

최소값(포함)과 무한대 사이의 출현 횟수

{,max}

0과 최대값(포함) 사이의 출현 횟수

탐욕

기본적으로 한정자와 함께 사용하면 정규 표현식 엔진은 탐욕(greedy) 모드로 작동하여 선택을 가능한 한 많이 확장합니다. 이는 처음에는 종종 당황스러운 결과를 초래합니다. 한정자 뒤에 ``?``를 붙이면 게으른(lazy) 모드가 됩니다. 같은 표현식에 두 개를 넣지 마세요. 결과를 예측할 수 없습니다.

한정자를 중첩하는 것은 주의하세요. 예를 들어 (a*)* 패턴은 처리 시간을 기하급수적으로 증가시킵니다.

대안

정규 표현식에서 | 문자는 논리적 ``OR``입니다. 앞의 표현식이나 뒤의 표현식 중 하나가 일치할 수 있음을 의미합니다.

제외

방법 1

제외할_패턴(*SKIP)(*FAIL)|선택할_패턴

예시:

"Blabla"(*SKIP)(*FAIL)|Blabla

Blabla 또는 “Blabla 또는 Blabla” 문자열에서는 Blabla를 선택하지만, “Blabla”에서는 선택하지 않습니다.

방법 2

제외할_패턴\K|(선택할_패턴)

"Blabla"\K|(Blabla)

Blabla 또는 “Blabla 또는 Blabla” 문자열에서는 Blabla를 선택하지만, “Blabla”에서는 선택하지 않습니다.

앵커

앵커는 문자가 아닌 문자열의 논리적 위치를 일치시키는 방법입니다. 텍스트 처리에 가장 유용한 앵커는 다음과 같습니다:

\b

단어 경계, 즉 공백에서 비공백 문자로의 전환을 나타냅니다. 예를 들어 ``bsurd``를 사용하면 ``the surd``는 일치하지만 ``absurd``는 일치하지 않습니다.

^

줄의 시작과 일치합니다 (기본값인 다중 줄 모드에서)

$

줄의 끝과 일치합니다 (기본값인 다중 줄 모드에서)

\K

선택의 시작 위치를 패턴 내의 해당 위치로 재설정합니다. 일부 정규 표현식 엔진(calibre는 해당하지 않음)은 특히 한정자와 함께 사용할 때 가변 길이의 룩비하인드를 허용하지 않습니다. 이러한 엔진에서 ``K``를 사용할 수 있다면 가변 길이의 긍정적 룩비하인드와 동등하게 작성하여 이 제한을 없앨 수도 있습니다.

그룹

(표현식)

캡처 그룹은 선택을 저장하며, 나중에 검색 또는 바꾸기 패턴에서 ``n``으로 참조할 수 있습니다. 여기서 ``n``은 캡처 그룹의 순서 번호입니다 (읽기 순서에서 1부터 시작)

(?:표현식)

선택을 캡처하지 않는 그룹

(?>표현식)

원자적 그룹: 표현식이 만족되는 즉시 정규 표현식 엔진이 통과하며, 나머지 패턴이 실패하면 해당 표현식으로 다른 조합을 시도하기 위해 백트래킹하지 않습니다. 원자적 그룹은 캡처하지 않습니다.

(?|표현식)

분기 재설정 그룹: 표현식에 포함된 대안의 분기가 동일한 그룹 번호를 공유합니다

(?<이름>표현식)

“name”이라는 이름의 그룹. 선택한 항목은 나중에 search 패턴에서 (?P=name) 으로, *replace*에서 ``g<name>``으로 다시 불러올 수 있습니다. 두 개의 서로 다른 그룹이 동일한 이름을 사용할 수 있습니다.

룩어라운드

룩어라운드

의미

?=

긍정적 룩어헤드 (선택 뒤에 놓음)

?!

부정적 룩어헤드 (선택 뒤에 놓음)

?<=

긍정적 룩비하인드 (선택 앞에 놓음)

?<!

부정적 룩비하인드 (선택 앞에 놓음)

룩어헤드와 룩비하인드는 문자를 소비하지 않으며, 길이가 0이고 캡처하지 않습니다.它们是 원자적 그룹입니다: 어서션이 만족되는 즉시 정규 표현식 엔진이 통과하며, 나머지 패턴이 실패하면 룩어라운드 내에서 다른 조합을 시도하기 위해 백트래킹하지 않습니다.

문자열에서 여러 일치 항목을 찾을 때, 각 일치 시도의 시작 위치에서 룩비하인드는 현재 위치 이전의 문자를 검사할 수 있습니다. 따라서 문자열 123에서 패턴 (?<=\d)\d (숫자 뒤에 오는 숫자)는 이론적으로 2와 3을 선택해야 합니다. 반면에 ``dKd``는 첫 번째 선택 후 시작 위치가 3 바로 앞이므로 2만 선택할 수 있으며, 두 번째 일치를 위한 충분한 숫자가 없습니다. 마찬가지로 ``d(d)``는 2만 캡처합니다. calibre의 정규 표현식 엔진에서는 긍정적 룩비하인드가 이론과 달리 동일한 방식으로 작동하여 2만 선택합니다.

그룹을 룩어라운드 안에 넣을 수 있지만, 캡처는 거의 유용하지 않습니다. 그럼에도 불구하고 유용한 경우, 룩비하인드에서 한정자를 사용할 때 매우 주의해야 합니다: 백트래킹의 부재와 관련된 탐욕은 예상치 못한 캡처를 초래할 수 있습니다. 이러한 이유로 긍정적 룩비하인드의 캡처 그룹에 한정자(또는 더 나쁜 경우 여러 개)가 있을 때는 긍정적 룩비하인드 대신 ``K``를 사용하세요.

부정적 룩어헤드 예시:

(?![^<>{}]*[>}])

패턴 끝에 놓으면 파일에 임베디드된 태그나 스타일 안에서 선택하는 것을 방지합니다.

가능하면 항상 룩어라운드를 “앵커링”하여 결과를 얻기 위해 필요한 단계 수를 줄이는 것이 좋습니다.

재귀

표현

의미

(?R)

전체 패턴의 재귀

(?1)

번호가 매겨진 캡처 그룹(여기서는 그룹 1)의 패턴만 재귀

재귀는 자기 자신을 호출하는 것입니다. 이는 중첩된 따옴표 문자열을 포함할 수 있는 따옴표 문자열 같은 균형 잡힌 쿼리에 유용합니다. 따라서 큰따옴표 사이의 문자열을 처리하는 동안 새로운 큰따옴표 문자열의 시작을 만나면, 어떻게 해야 하는지 알고 있으므로 자기 자신을 호출합니다. 그러면 다음과 같은 패턴을 갖게 됩니다:

start-pattern(?>atomic sub-pattern|(?R))*end-pattern

중첩된 문자열에서 멈추지 않고 큰따옴표 사이의 문자열을 선택하려면:

“((?>[^“”]+|(?R))*[^“”]+)”

이 템플릿은 <div> 태그처럼 중첩될 수 있는 태그 쌍을 수정하는 데도 사용할 수 있습니다.

특수 문자

표현

문자

\t

\n

줄바꿈

\x20

(끊어질 수 있는) 공백

\xa0

줄바꿈 없는 공백

메타 문자

메타 문자는 정규 표현식 엔진에 특별한 의미를 갖는 문자입니다. 이 중 12개는 이스케이프 문자인 백슬래시(\)를 앞에 붙여야 특별한 의미를 잃고 일반 문자가 됩니다:

^ . [ ] $ ( ) * + ? | \

또 다른 7개의 메타 문자는 백슬래시를 앞에 붙일 필요가 없습니다 (다른 결과 없이 붙일 수도 있습니다):

{ } ! < > = :

특수 문자는 클래스 안(괄호 [] 사이)에서 사용하면 특수 문자 지위를 잃습니다. 닫는 괄호와 대시는 클래스 안에서 특수한 지위를 가집니다. 클래스 밖에서 대시는 단순 리터럴이고, 닫는 괄호는 메타 문자로 유지됩니다.

슬래시(/)와 우물 정자(또는 해시 문자)(#)는 메타 문자가 아니므로 이스케이프할 필요가 없습니다.

Python 엔진을 사용하는 regex101.com 같은 일부 도구에서는 큰따옴표가 구분자로서 특별한 지위를 가지며, 이스케이프하거나 옵션을 변경해야 합니다. calibre의 편집기에서는 그렇지 않습니다.

모드

(?s)

점(.)이 줄바꿈 문자도 일치하도록 합니다

(?m)

^``와 ``$ 앵커가 전체 문자열의 시작과 끝이 아닌 줄의 시작과 끝을 일치하도록 합니다.