コンテンツにスキップ

正規表現

正規表現コマンド共通の仕様

対象

regex_match,regex_find,regex_findall,regex_count,regex_replace,regex_replace_first,regex_erase,regex_erase_first,regex_split,regex_escape

パターン

エンジンはuka_regexp(Unlicense)。構文と意味はPCRE2(Perl互換)に近い。文字クラス、Unicodeプロパティ(\p{Hiragana}など)、最短・所有量指定子、先読み・後読み、名前付きグループ、後方参照、再帰、条件分岐などが使える。\d \w \s \bとPOSIXクラス([[:alpha:]]など)は、既定ではASCIIのみが対象(全角数字には一致しない)。パターンの先頭に(*UCP)を書くと、Unicodeのプロパティで判定される。

パターンは、辞書の単語としてもスクリプトの引数としても、括弧を含むときは"..."で囲むこと。括弧がそのままだと華和梨のスクリプトの構文として消えてしまう。"..."の中の${...}や$(...)は展開されないので、置換文字列の${1}や${name}も同様に"..."で囲めばそのまま渡せる。構文の詳細はuka_regexpのREADME.mdを参照。

オプション

文字の並びで指定する(省略または空文字列でなし)。

  • i: 大文字小文字を区別しない
  • s: . が改行にも一致する
  • m: ^ と $ が行頭・行末に一致する
  • x: パターン中の空白とコメント(# から行末)を無視する

パターンの中の (?i) (?s) (?m) (?x) でも指定できる。

位置

位置は0オリジンの文字数。負の値は末尾から数える(-1が最後の文字)。Windowsでは、BMP外の文字(絵文字など)は2文字として数える。ただしパターンの中では、サロゲートペアは1文字として扱われる(.や[^a]は絵文字全体に一致する)。一致の開始位置・終了位置がペアの途中になることはない。

サブルーチン呼び出し

パターンの中の(?&名前) (?P>名前) \g<名前>のようなサブルーチン呼び出しで、パターン内に定義(?<名前>...)が無い名前は、辞書のエントリ${名前}の展開結果がその名前のグループの中身として取り込まれる。エントリが存在しなければ、不正なパターンとして扱われる(エラーログが出て、空文字列が返る)。取り込まれた文字列の中でさらに別の名前を呼んでもよい。

取り込まれたグループは結果(エントリに格納されるグループ)には現れず、パターン自身の括弧のグループだけが数えられる。名前に使えるのは英数字・_・日本語などで、.は使えない(名前空間の中のエントリは呼べない)。エントリが複数の単語を持つときは、通常の参照と同じくランダムに1つが選ばれる。

# 辞書
year : [0-9]{4}
date : "(?&year)-([0-9]{2})-([0-9]{2})"

=kis
regex_match "2026-10-18" "^(?&date)$" "" m;
# ${m} は 2026-10-18 を含む。パターンに括弧が無いので、グループは全体の1つだけ
=end

エラー

オプションやパターンが不正なとき、マッチに時間がかかりすぎて打ち切ったとき(パターンによっては指数時間かかるため、入力に応じた回数でバックトラックを止める)は、ログにエラーを出し、空文字列を返す。


regex_match

書式

$(regex_match 文字列1 パターン [オプション [エントリ1]])

戻り値

文字列1のどこかにパターンがマッチすれば1、しなければ0。エラーのときは空文字列

解説

エントリ1を指定すると、その内容を置き換えて、マッチした部分全体、続いて括弧のグループ1、2、...を順に格納する(マッチしなかったグループは空文字列。マッチしなければエントリは空になる)。先頭からの完全一致を調べるには^と$を使う。

使用例

=kis
regex_match "key=42" "([a-z]+)=([0-9]+)" "" m;
# 1が返り、mは「key=42」「key」「42」の3単語になる
=end

regex_find

書式

$(regex_find 文字列1 パターン [オプション [位置 [エントリ1]]])

戻り値

位置以降で最初にマッチした位置。マッチしない、または位置が範囲外なら-1。エラーのときは空文字列

解説

位置を省略または空文字列にすると0。エントリ1の扱いはregex_matchと同じ。

使用例

=kis
regex_find "abc123def" "[0-9]+";
# 3が返る
=end

regex_findall

書式

$(regex_findall エントリ1 文字列1 パターン [オプション])

戻り値

マッチした個数。エラーのときは空文字列

解説

マッチした部分すべてを、エントリ1の内容を置き換えて順に格納する。

使用例

=kis
regex_findall nums "a1b22c333" "[0-9]+";
# 3が返り、numsは「1」「22」「333」になる
=end

regex_count

書式

$(regex_count 文字列1 パターン [オプション])

戻り値

マッチした個数。エラーのときは空文字列

解説

文字列1の中でパターンがマッチする個数を数える。


regex_replace

書式

$(regex_replace 文字列1 パターン 置換文字列 [オプション])

戻り値

置換後の文字列(マッチしなければ文字列1のまま)。エラーのときは空文字列

解説

マッチした部分すべてを置換文字列で置き換える。置換文字列の中では次が使える。

  • $1 $2 ...: そのグループにマッチした文字列
  • ${名前}, ${1}: 名前・番号で指定
  • $&: マッチした全体
  • $` $': マッチの前・後ろ
  • $$: $ という文字

$ を含む置換文字列は "..." で囲むこと。

使用例

=kis
regex_replace "a1b22" "([a-z])([0-9]+)" "$2$1";
# 「1a22b」が返る
=end

regex_replace_first

書式

$(regex_replace_first 文字列1 パターン 置換文字列 [オプション])

戻り値

置換後の文字列。エラーのときは空文字列

解説

regex_replaceと同じだが、最初にマッチした部分だけを置き換える。


regex_erase

書式

$(regex_erase 文字列1 パターン [オプション])

戻り値

マッチした部分を取り除いた文字列。エラーのときは空文字列

解説

マッチした部分すべてを削除する(空文字列での置換)。


regex_erase_first

書式

$(regex_erase_first 文字列1 パターン [オプション])

戻り値

最初にマッチした部分を取り除いた文字列。エラーのときは空文字列

解説

最初にマッチした部分だけを削除する。


regex_split

書式

$(regex_split エントリ1 文字列1 パターン [オプション [最大個数]])

戻り値

分割した要素の個数。エラーのときは空文字列

解説

文字列1をパターンにマッチした部分で分割し、エントリ1の内容を置き換えて順に格納する(splitと違い、以前の内容は消える)。最大個数が正のとき、要素数はその個数までで、残りは最後の要素に入る。先頭と末尾での空文字列へのマッチでは区切らない。パターンが空文字列なら、文字ごとに分割する。

使用例

=kis
regex_split items "a, b,c" ",\s*";
# 3が返り、itemsは「a」「b」「c」になる
=end

regex_escape

書式

$(regex_escape 文字列1)

戻り値

エスケープした文字列

解説

正規表現の特殊文字(\ ^ $ . | ? * + ( ) [ ] { } # と空白)の前に\を付ける。文字列1をそのままパターンの一部として使いたいときに使う。