正規表現

正規表現は、例えば「〜で始まり〜で終わる部分」というような、特定の条件の文字列を指定するのに使われます。
miでは、検索・置換機能のほか、見出し機能インデント機能などで使用可能です。

文字に一致する正規表現

正規表現一致する文字

.

改行コード以外の任意の一文字

\w

単語を構成する文字
英数字、アンダーバー、漢字、ひらがな、カタカナ等

\W

単語を構成する文字以外

\d

数字

\D

数字以外

\s

スペース、改行、タブ

\S

スペース、改行、タブ以外

\t

タブ

\n

改行(\n, \rどちらでも同じ)

\r

改行(\n, \rどちらでも同じ)

[]

文字範囲指定

  1. []内の文字のうちいずれか
  2. a-zのようにハイフォンでつないだ場合は、aからzのうちのいずれか
  3. ^で始まる場合は、否定を表し、[]内の文字以外に一致
  4. \w, \d, \s, \x{}, \uの使用が可能([]外にあるときと同じ意味)

記述例:英数字以外に一致

[^0-9a-zA-Z]

記述例:ひらがなに一致

[\x{3041}-\x{3096}]

\x{}

\x{}内の文字(0-9,A-F)を16進数Unicodeとした文字(U+10000以降も指定可能です)

記述例:「あ」に一致

\x{3042}

\u

\uの後の文字(0-9,A-F)を16進数Unicodeとした文字(U+10000以降も指定可能です)

記述例:「あ」に一致

\u3042

普通の文字

その文字に一致します。漢字等も使用可能です。
普通の文字とは、., \, [, ], (, ), *, +, ?, {, }, |, ^, $以外の文字のことを指します。

\の後に記号

その記号に一致します。

記述例:"("に一致

\(

繰り返し

直前の文字、または、グループを、指定回数繰り返したものに一致します。

最長一致の場合、繰り返し数が最も多い文字列に一致します。
最短一致の場合、繰り返し数が最も少ない文字列に一致します。

たとえば、以下のサンプルテキストについて、 ""に囲まれた部分を最長一致、最短一致で、テキストの最初から検索した場合の結果は、それぞれ次のようになります。

サンプルテキスト:

"abc" and "def"

正規表現記述例:(最長一致)

".*"

→結果:"abc" and "def"に一致

正規表現記述例:(最短一致)

".*?"

→結果:"abc"に一致

正規表現繰り返し数

*

0回以上(最長一致)

*?

0回以上(最短一致)

+

1回以上(最長一致)

+?

1回以上(最短一致)

?

0回、または、1回(最長一致)

??

0回、または、1回(最短一致)

{n,m}

n回以上、m回以下(最長一致)
※mを省略した場合はn回以上。

{n,m}?

n回以上、m回以下(最短一致)
※mを省略した場合はn回以上。

{n}

n回(最長一致)

{n}?

n回(最短一致)

選択

正規表現説明

|

|より前に記述した正規表現と、|より後に記述した正規表現のいずれかに一致します。

記述例:

東京|大阪

→結果:"東京"または"大阪"に一致

グループ

正規表現説明

(regexp)

()で囲んだ部分はグループとなります。

  1. 繰り返しや選択の適用範囲を指定します。
  2. 記述例:

    (abc)+
  3. ()内に一致した文字列が記憶されます。
    最初の(から順に、1からの番号が割り振られます。(グループ番号)
    置換文字列中の$n(nはグループ番号)は、対応するグループの文字列に置き換えられます。
  4. <検索機能での記述例>

    検索文字列:

    <h1>(.*?)</h1>

    置換文字列:

    <h2>$1</h2>

    →結果:<h1>〜</h1>が、<h2>〜</h2>に置換される。

$nは見出し機能でも同様の意味で使用します。

なお、$0は正規表現に一致した文字列全体となります。

(?:regexp)

グループ番号が割り振られません。繰り返しや選択の適用範囲を指定したいだけのときに使用できます。

\n
nは整数

グループnの文字列と一致します。(後方参照)

記述例:

(^.+\n)(\1)+

→結果:連続した重複行に一致

特定の位置に一致する正規表現

正規表現一致対象

^

段落の最初

$

段落の最後

\b

単語の境界
単語文字(\w)と非単語文字(\W)の境界の位置に一致します。

\B

単語の境界以外
単語文字(\w)と非単語文字(\W)の境界の位置以外に一致します。

(?=regexp)

先読み

正規表現regexpに一致するかどうかを(対象テキストを先読みして)チェックし、regexpに一致する箇所の”開始位置”に一致します。
regexpに不一致の場合、正規表現全体は不一致となります。
regexpに一致の場合、対象テキストの先読みした部分の最初に戻ってから、正規表現一致判定を続けます。

(先読みした部分は、この正規表現に一致した部分とはみなされず、正規表現置換の対象にもなりません。)

(?!regexp)

否定先読み

正規表現regexpに不一致かどうかを(対象テキストを先読みして)チェックし、regexpに一致しない箇所の”開始位置”に一致します。
regexpに一致の場合、正規表現全体は不一致となります。
regexpに不一致の場合、対象テキストの先読みした部分の最初に戻ってから、正規表現一致判定を続けます。

記述例:

^(?!.*東京).*$

→結果:"東京"を含まない行に一致


(先読みした部分は、この正規表現に一致した部分とはみなされず、正規表現置換の対象にもなりません。)

(?<=regexp)

後読み

regexpに一致する箇所の”終了位置”に一致します。
(後読みした部分は、この正規表現に一致した部分とはみなされず、正規表現置換の対象にもなりません。)

(?<!regexp)

否定後読み

regexpに一致しない箇所の”終了位置”に一致します。

記述例:

(?<![0-9])(?!1000000)[0-9]{7}(?![0-9])

→結果:1000000以外の7桁の数値に一致

(後読みした部分は、この正規表現に一致した部分とはみなされず、正規表現置換の対象にもなりません。)

その他

正規表現説明

\Q文字列\E

\Q\E間の文字列部分が、バックスラッシュ等を含め、すべて普通の文字として扱われます。

(?#コメント)

コメントです。無視されます。

置換文字列

正規表現置換時、置換文字列内の下記の文字列はそれぞれ下記のように置き換えられます。

文字列実際に置換される文字列

$0

正規表現に一致した文字列全体

$n
nは整数

正規表現のグループ番号nに一致した文字列

\$

$

\\

\

\n

改行(\n, \rどちらでも同じ)

\r

改行(\n, \rどちらでも同じ)

\t

タブ

正規表現エンジン間の差分

「macOS 標準の正規表現処理」「macOS 標準の正規表現処理(単語境界にUnicode TR#29の定義を使う)」はmacOSのAPIであるNSRegularExpressionを使用しています。
NSRegularExpressionは、International Components for Unicode (ICU)の正規表現に準拠しているとのことです。

「mi バージョン3.7以前互換の正規表現処理」→「macOS 標準の正規表現処理」への差分

「macOS 標準の正規表現処理」→「macOS 標準の正規表現処理(単語境界にUnicode TR#29の定義を使う)」の差分