正規表現の構文のクイックリファレンス¶
このチェックリストには、calibre のほとんどのパーツで利用可能な正規表現エンジンのうち、最も一般的に利用される/覚えにくいものをまとめてあります。
文字クラス¶
文字クラスは異なる文字グループを簡潔に表現するのに役立ちます。
例:
表現 |
クラス |
|
小文字。アクセント記号や合字を含むことはできません |
|
小文字の英字 a から z もしくは数字 0 から 9 |
|
大文字、小文字、ダッシュ。クラスにダッシュを含めるには、文字の範囲を指定するハイフンと混合させないように、先頭または後尾でダッシュを入れる必要があります。 |
|
10進数字を除いた任意の文字。クラスの先頭に (^) を置くと、そのクラス (補完クラス) の文字を除外します |
|
小文字の子音。クラスはクラスに含めることが可能です。 |
|
すべての文字 (外国のアクセント文字を含む)。クラス内で文字クラスの略記法を使用できます。 |
例:
<[^<>]+> to select an HTML tag
文字クラスの略記法¶
表現 |
クラス |
|
10 進数字 (``[0-9]` と同等) |
|
非 10 進数字 ( |
|
単語構成文字 ( |
|
非単語構成文字 |
|
スペース、ノンブレーキングスペース、タブ、改行などの空白文字 |
|
非空白文字 |
|
改行を除いた任意の文字。改行文字を含めるには「すべてドット」のチェックボックスを使用するか、正規表現修飾子 |
量指定子¶
量指定子 |
量指定子の前に置かれる式の出現回数 |
|
expression の 0 回または 1 回の出現。 |
|
expression の 1 回以上の出現。 |
|
expression の 0 回以上の出現。 |
|
expression のちょうど n 回の出現 |
|
出現の回数が min 以上 max 以下 |
|
出現の回数が min 以上 |
|
出現の回数が 0 以上 max 以下 |
貪欲¶
デフォルトでは、量指定子を使用したときに、正規表現エンジンは貪欲です。つまり選択範囲を可能な限り広げます。最初のうちは、しばしばびっくりするような結果になります。量指定子の後ろに ?
をつけると、怠惰になります。同じ式の中に 2 つを同時に入れることは避けてください。予測できない結果となる可能性があります。
量指定子を入れ子にしないよう気を付けてください。たとえばパターン (a*)*
のような使い方をすると、処理時間が指数関数的に増加してしまいます。
選択子¶
正規表現の中の |
文字は、論理 OR
です。これは前の式または後ろの式のいずれかがマッチすればよいという意味になります。
除外¶
方法 1
pattern_to_exclude(*SKIP)(*FAIL)|pattern_to_select
例:
"Blabla"(*SKIP)(*FAIL)|Blabla
これは Blabla または "Blabla or Blabla" の文字列中の Blabla を選択しますが、"Blabla" では選択しません。
方法 2
pattern_to_exclude\K|(pattern_to_select)
"Blabla"\K|(Blabla)
これは Blabla または "Blabla or Blabla" の文字列中の Blabla を選択しますが、"Blabla" では選択しません。
アンカー¶
アンカーは、文字ではなく、文字列の論理的な位置にマッチさせる方法です。テキスト処理に最も役立つアンカーは次のものです:
\b
単語の区切り、すなわち空白から非空白への遷移。たとえば
\bsurd
はthe surd
にマッチしますがabsurd
にはマッチしません。^
行の先頭にマッチ (複数行モードの場合。デフォルトは複数行モード)
$
行の末尾にマッチ (複数行モードの場合。デフォルトは複数行モード)
\K
選択範囲の開始位置をパターン内のその位置にリセットします。一部の正規表現エンジンでは (ただし calibre は違います) 特に量指定子を指定した場合に、可変長の後読みが許されていません。このようなエンジンで
\K
が利用できる場合には、可変長の肯定後読みと同等のものを書くことによってこの制限を取り除けます。
グループ¶
(expression)
グループをキャプチャします。グループには選択範囲が格納され、後で 検索 や 置換 のパターンとして
\n
で参照できます。n はキャプチャしたグループの連番 (1 から順に読込み順) です(?:expression)
選択範囲をキャプチャしないグループ化
(?>expression)
アトミックグループ: expression が満足したら即座に正規表現エンジンが処理を抜け、もし残りのパターンが失敗した場合には、その expression の他の組み合わせを試すためのバックトラッキングを行いません。
(?|expression)
ブランチリセットグループ: expression に含まれる代替のブランチが同じグループ番号を共有します
(?<name>expression)
“name” という名前のグループ。選択範囲は後で 検索 パターンからは
(?P=name)
として、 置換 では\g<name>
として呼び出すことができます。2 つの別のグループが同じ名前を使用できます。
前後読み¶
前後読み |
意味 |
|
肯定先読み (選択部分の前の位置) |
|
否定先読み (選択部分の後ろの位置) |
|
肯定後読み (選択部分の後ろの位置) |
|
否定後読み (選択部分の前の位置) |
先読みと後読みは文字を消費せず、長さゼロでキャプチャされません。どちらもアトミックグループです。条件が満たされると即座に正規表現エンジンは処理を抜け、もし残りのパターンが失敗した場合には、その他の組み合わせを試すためのバックトラッキングを行いません。
文字列の中で複数のマッチを検索するとき、それぞれのマッチを試行する最初の位置で、後読みは現在の位置の前にある文字を検査できます。したがって 123 という文字列で、(?<=\d)\d
というパターン (前に数字がついている数字) は、理論的には 2 と 3 を選択するはずです。一方、\d\K\d
は 2 しか選択できません。なぜなら最初の選択の後の開始位置は 3 の直前であり、2 番目のマッチに十分な長さの数字がないためです。同様に、\d(\d)
は 2 しかキャプチャしません。calibre の正規表現エンジンのやり方では、肯定後読みも同じように動作し、理論に反して 2 しか選択しません。
前後読みの内側にグループを配置することも可能ですが、キャプチャが役に立つことは滅多にありません。それでももし有用である場合には、後読みの中での量指定子の使用にはとても慎重になるべきです。バックトラックがないことに関連付けられた貪欲さは、びっくりするようなキャプチャをもたらすことがあります。このような理由から、肯定後読みのキャプチャグループの中に量指定子がある場合には、肯定後読みではなく \K
を使用してください。
否定先読みの例:
(?![^<>{}]*[>}])
パターンの最後に配置すると、ファイルに埋めこまれたタグやスタイルの中で選択できなくなります。
可能な限り、結果を得るのに必要なステップ数を減らすために、後読みを「アンカー」する方がよいでしょう。
再帰¶
表現 |
意味 |
|
パターン全体の再帰 |
|
番号で指定されたキャプチャグループのパターンのみの再帰。ここではグループ 1 |
再帰とは自分自身を呼び出すことです。これは均衡のあるクエリで役に立ちます。たとえば引用符で囲まれた文字列を埋めこむことのできる引用符つきの文字列などです。このように、二重引用符に囲まれた文字列の処理中に、二重引用符で囲まれた新しい文字列に当たってしまったとき、どうすればよいかもうお分かりでしょうが、自分自身を呼び出すのです。そうするとこのようなパターンになります:
start-pattern(?>atomic sub-pattern|(?R))*end-pattern
二重引用符で囲まれた文字列を、その中に埋めこまれた文字列で止まらずに選択するには、次のようにします:
“((?>[^“”]+|(?R))*[^“”]+)”
このテンプレートは、入れ子にできる一組みのタグ、たとえば <div>` タグの変更にも使用できます。
特殊文字¶
表現 |
文字 |
|
タブ文字 |
|
改行 |
|
(改行可能な) 空白文字 |
|
ノーブレークスペース |
メタ文字¶
メタ文字は、正規表現エンジンにとって特別な意味を持つ文字です。このうち次の 12 個の文字は、特殊文字として使用せずに通常の文字として扱うためには前にエスケープ文字、すなわちバックスラッシュ (\
) をつける必要があります。
^ . [ ] $ ( ) * + ? | \
残りの 7 個の特殊文字はバックスラッシュを前に付ける必要はありません (ただし、つけないと結果が変わる可能性があります)
{ } ! < > = :
特殊文字はクラス内 (角カッコ []
の内側) では特殊文字ではなくなります。閉じカッコとダッシュはクラス内で特殊文字となります。クラスの外側では、ダッシュは単なる文字となりますが、閉じカッコはメタ文字のままです。
スラッシュ (/) および 番号記号 (またはハッシュ文字) (#) はメタ文字ではないため、エスケープする必要はありません。
Python エンジンを搭載した regex101.com のような一部のツールでは、二重引用符は特別な意味を持つ区切り文字のため、エスケープするかオプションを変更する必要があります。calibre のエディタでは、その必要はありません。
モード¶
(?s)
ドット (
.
) に改行文字もマッチさせます(?m)
^
および$
アンカーを文字列全体の先頭と末尾ではなく、行の先頭と末尾にマッチさせます。