正規表現

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

文字に一致する正規表現

正規表現一致する文字

.

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

\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

この後に続く2文字を16進数アスキーコードとした文字

\x{}

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

記述例:「あ」に一致

\x{3042}

\u

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

記述例:「あ」に一致

\u3042

\c

この後に続く1文字についてaをアスキーコード1、zをアスキーコード26とした文字

普通の文字

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

\の後に記号

その記号に一致します。

記述例:"("に一致

\(

繰り返し

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

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

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

サンプルテキスト:

"abc" and "def"

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

".*"

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

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

".*?"

→結果:"abc"に一致

正規表現繰り返し数

*

0回以上(最長一致)

*?

0回以上(最短一致)

+

1回以上(最長一致)

+?

1回以上(最短一致)

?

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

??

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

{n,m}

n回以上、m回以下(最長一致)※n,mは0以上65534以下の整数。n <= m

{n,m}?

n回以上、m回以下(最短一致)※n,mは0以上65534以下の整数。n <= m

{n}

n回(最長一致)※nは0以上65534以下の整数。

{n}?

n回(最短一致)※nは0以上65534以下の整数。

選択

正規表現説明

|

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

記述例:

東京|大阪

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

グループ

正規表現説明

(regexp)

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

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

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

    検索文字列:

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

    置換文字列:

    <h2>$1</h2>

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

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

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

グループ番号の最大は100です。101番目以降のグループにはグループ番号が割り振られず、文字列も記憶されません。

(?:regexp)

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

\n

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

記述例:

(..)-\1

→結果:ab-ab, cc-ccなど、ハイフォンで区切って、同じ2文字が繰り返される文字列に一致

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

正規表現一致対象

^

段落の最初

$

段落の最後

\b

単語の境界
アルファベット(A-Z,a-z)、数字(0-9)、アンダーバー(_)が連続した部分を単語とみなします。

\B

単語の境界以外
アルファベット(A-Z,a-z)、数字(0-9)、アンダーバー(_)が連続した部分を単語とみなします。

その他

正規表現説明

(?=regexp)

先読み

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

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

(?!regexp)

否定先読み

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

記述例:

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

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

記述例:

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

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


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

(?#コメント)

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