正規表現
正規表現は、例えば「〜で始まり〜で終わる部分」というような、特定の条件の文字列を指定するのに使われます。
miでは、検索・置換機能のほか、見出し機能、
インデント機能などで使用可能です。
- デフォルト設定では、\(バックスラッシュ)、¥(半角¥記号)どちらもエスケープ文字として動作します。
設定変更により、\(バックスラッシュ)のみに変更可能です。
☞アプリケーション設定→「検索」タブ - miバージョン3.8以降より、検索・置換機能用の正規表現エンジンを「macOS 標準の正規表現処理」「macOS 標準の正規表現処理(単語境界にUnicode TR#29の定義を使う)」「mi バージョン3.7以前互換の正規表現処理」から選択できるようになりました。
☞アプリケーション設定→「検索」タブ
以下は「macOS 標準の正規表現処理」について説明しています。各エンジン間の差分についてはこちらをご参照ください。
文字に一致する正規表現
正規表現 | 一致する文字 |
---|---|
|
改行コード以外の任意の一文字 |
|
単語を構成する文字 |
|
単語を構成する文字以外 |
|
数字 |
|
数字以外 |
|
スペース、改行、タブ |
|
スペース、改行、タブ以外 |
|
タブ |
|
改行(\n, \rどちらでも同じ) |
|
改行(\n, \rどちらでも同じ) |
|
文字範囲指定
記述例:英数字以外に一致
記述例:ひらがなに一致
|
|
\x{}内の文字(0-9,A-F)を16進数Unicodeとした文字(U+10000以降も指定可能です) 記述例:「あ」に一致
|
|
\uの後の文字(0-9,A-F)を16進数Unicodeとした文字(U+10000以降も指定可能です) 記述例:「あ」に一致
|
|
その文字に一致します。漢字等も使用可能です。 |
|
その記号に一致します。 記述例:"("に一致
|
繰り返し
直前の文字、または、グループを、指定回数繰り返したものに一致します。
最長一致の場合、繰り返し数が最も多い文字列に一致します。
最短一致の場合、繰り返し数が最も少ない文字列に一致します。
たとえば、以下のサンプルテキストについて、 ""に囲まれた部分を最長一致、最短一致で、テキストの最初から検索した場合の結果は、それぞれ次のようになります。
サンプルテキスト:
"abc" and "def"
正規表現記述例:(最長一致)
".*"
→結果:"abc" and "def"に一致
正規表現記述例:(最短一致)
".*?"
→結果:"abc"に一致
正規表現 | 繰り返し数 |
---|---|
|
0回以上(最長一致) |
|
0回以上(最短一致) |
|
1回以上(最長一致) |
|
1回以上(最短一致) |
|
0回、または、1回(最長一致) |
|
0回、または、1回(最短一致) |
|
n回以上、m回以下(最長一致) |
|
n回以上、m回以下(最短一致) |
|
n回(最長一致) |
|
n回(最短一致) |
選択
正規表現 | 説明 |
---|---|
|
|より前に記述した正規表現と、|より後に記述した正規表現のいずれかに一致します。 記述例:
→結果:"東京"または"大阪"に一致 |
グループ
正規表現 | 説明 |
---|---|
|
()で囲んだ部分はグループとなります。
記述例:
<検索機能での記述例> 検索文字列:
置換文字列:
→結果:<h1>〜</h1>が、<h2>〜</h2>に置換される。 $nは見出し機能でも同様の意味で使用します。 なお、$0は正規表現に一致した文字列全体となります。 |
|
グループ番号が割り振られません。繰り返しや選択の適用範囲を指定したいだけのときに使用できます。 |
|
グループnの文字列と一致します。(後方参照) 記述例:
→結果:連続した重複行に一致 |
特定の位置に一致する正規表現
正規表現 | 一致対象 |
---|---|
|
段落の最初 |
|
段落の最後 |
|
単語の境界
|
|
単語の境界以外
|
|
先読み
正規表現regexpに一致するかどうかを(対象テキストを先読みして)チェックし、regexpに一致する箇所の”開始位置”に一致します。 |
|
否定先読み
正規表現regexpに不一致かどうかを(対象テキストを先読みして)チェックし、regexpに一致しない箇所の”開始位置”に一致します。 記述例:
→結果:"東京"を含まない行に一致 (先読みした部分は、この正規表現に一致した部分とはみなされず、正規表現置換の対象にもなりません。) |
|
後読み
regexpに一致する箇所の”終了位置”に一致します。 |
|
否定後読み
regexpに一致しない箇所の”終了位置”に一致します。 記述例:
→結果:1000000以外の7桁の数値に一致 |
その他
正規表現 | 説明 |
---|---|
|
|
|
コメントです。無視されます。 |
置換文字列
正規表現置換時、置換文字列内の下記の文字列はそれぞれ下記のように置き換えられます。
文字列 | 実際に置換される文字列 |
---|---|
|
正規表現に一致した文字列全体 |
|
正規表現のグループ番号nに一致した文字列 |
|
$ |
|
\ |
|
改行(\n, \rどちらでも同じ) |
|
改行(\n, \rどちらでも同じ) |
|
タブ |
正規表現エンジン間の差分
「macOS 標準の正規表現処理」「macOS 標準の正規表現処理(単語境界にUnicode TR#29の定義を使う)」はmacOSのAPIであるNSRegularExpressionを使用しています。
NSRegularExpressionは、International Components for Unicode (ICU)の正規表現に準拠しているとのことです。
「mi バージョン3.7以前互換の正規表現処理」→「macOS 標準の正規表現処理」への差分
- \wは、従来「半角英数字、アンダーバー」でしたが、漢字、ひらがな、カタカナ等を含むようになりました。(\Wはその逆となります。)
正確な定義は[\p{Alphabetic}\p{Mark}\p{Decimal_Number}\p{Connector_Punctuation}\u200c\u200d]
となります。詳細はこちらをご参照ください。
\b, \Bも、\w, \Wの定義に従います。 - \d, \sは、従来半角のみでしたが、全角も含むようになりました。(\D, \Sはその逆となります。)
- 後読み、否定後読み、\Q〜\E等の正規表現が追加されます。詳細はこちらをご参照ください。
「macOS 標準の正規表現処理」→「macOS 標準の正規表現処理(単語境界にUnicode TR#29の定義を使う)」の差分
- 単語境界\b, \Bは、単語文字(\w)と非単語文字(\W)の境界ではなく、Unicode TR#29の定義に従います。
定義が複雑ですが、基本的に一般的な単語の定義に近くなるようです。
たとえば、アルファベット+漢字+ひらがながつながった部分の、アルファベットと漢字の間、漢字とひらがなの間が\bの対象となり、"can't"のアポストロフィの前後は\bの対象とはならなくなります。