Syou Book Rings

アプリについて

テキストに対し、正規表現を用いた置換処理を行えます。手軽に置換処理をしたい場合や、正規表現のデバッグにお使いください。データのアップロードを行わないので、プライバシーやビジネスに関わるデータも安心して処理できます。

早見表つきです。

本体

JavaScript読み込み中…(表示が変化しない場合、エラーの可能性があります。Javascriptは有効になっていますか?)

備考

文字コードと改行コード

  • ファイル選択時の文字コード自動判別は、
    • Shift-JIS
    • ISO-2022-JP
    • EUC-JP
    • UTF-8
    • Unicode
    • Unicode
    • ASCII
    に対応している。
  • 改行は元の改行コードによらず「\n」で指定。「\r」は不要。

関数による置換

JavaScript限定の機能として、関数による置換が可能。ただし、非対応のブラウザがある可能性がある。

指定した関数の第一引数はマッチした部分文字列そのものを保持します。第一引数が RegExp オブジェクトだった場合、それに続く n 個の引数は、括弧でキャプチャしたマッチによって記憶されたサブマッチの文字列として使うことができます。n には正規表現におけるサブマッチの文字列の数が入ります。最後に、最後の 2 つの引数は、そのマッチが現れた文字列内のオフセットとその文字列それ自身です。
サンプル
  function replacer(str, p1, p2, offset, s) {
    return 'ab';
  }
  var newString = "AAXXzzzzBB".replace(/(X+)(z+)/, replacer);
  

この場合の引数は以下の通り。

str
XXzzzz
p1
XX
p2
zzzz
offset
2
s
AAXXzzzzBB

正規表現早見

基本および頻出

メタ文字等説明使用例マッチ文字列
.何か一文字(改行コードを除く)あ.たあんた, あなた, あ た
^行頭
$行末
*0以上の繰り返し.*(あらゆる行)
+1以上の繰り返しa+a, aa, aaaaaa
?あるかないかwindows?window, windows
[ ]この中のどれか一文字後述
|どちらかの文字列わたしは犬|猫が好きだわたしは犬, 猫が好きだ
( )グループ化わたしは(犬|猫)が好きだわたしは犬が好きだ, わたしは猫が好きだ
{n}n回の繰り返し
{n,m}n回以上m回以下の繰り返し
{n,}n回以上の繰り返し
*?0以上の繰り返し(できるだけ短く)
+?1以上の繰り返し(できるだけ短く)
??あるかないか
{n}?n回の繰り返し(できるだけ短く)
{n,m}?n回以上m回以下の繰り返し(できるだけ短く)
{n,}?n回以上の繰り返し(できるだけ短く)
\tタブ
\n改行コード
\rキャリッジリターン
\w英単語に含まれる文字([0-9A-Za-z_])
\W英単語に含まれる文字以外
\s空白文字([\t\n\f\r])
\S空白文字以外
\d数字([0-9])
\D数字以外
\\バックスラッシュ
\1, \2, ...(検索文字列で)グループの後方参照
$1, $2, ...(置換文字列で)グループの後方参照
$&(置換文字列で)マッチした全体

応用

メタ文字等説明使用例マッチ文字列
\aアラーム
\b([ ]内で)バックスペース
\b([ ]外で)単語境界
\B単語境界以外
\f改ページ
\eエスケープ
\ooo8進数の文字コード\101A
\xhh16進数の文字コード\x41A
(?: )後方参照にキャッシュせずにグループ化
(?# )<非対応>コメント
(?= )ゼロ幅の肯定的先読み表現後述
(?! )ゼロ幅の否定的先読み表現後述
(?<= )<非対応>ゼロ幅の肯定的後読み表現後述
(?<! )<非対応>ゼロ幅の否定的後読み表現後述

クラス化([ ])について

大文字小文字を区別しない検索は、オプションで指定する以外に[Hh][Th][Mm][Ll]と書くことでも可能。HTML|htmlとは、Htmlがマッチしない点で異なる。

大文字の文字列を検索したい場合は[ABCDEFGHIJKLMNOPQRSTUVWXYZ]+と書けばよいが、文字コードが連続している場合は[A-Z]+とハイフンで書くことが可能。

[^A]と書くと、A以外の一文字にマッチする。大文字以外なら[^A-Z]

[ ]内にメタ文字を書きたい場合は、[\$]でなく[$]でよい。また、ハイフンと大文字なら[-A-Z]と書くのが正しい書き方。しかし、[A-Z-]でも[A-Z\-]でも正しく動くっぽい。^以外なら[^^][[\]]と書くことができる。

先読みと後読み

先読み・後読みでマッチするのは、文字ではなく「場所」。abcdebcの間、文字の境目を指定できる。このような正規表現は、アンカーと呼ばれる。行頭(^)や行末($)もアンカー。単語境界(\b)も実はアンカー。

例えば、aaaaaa123aaaaa456aaaa7890という文字列を考える。
(?=123)Xで置換するとaaaaaaX123aaaaa456aaaa7890と置換される。つまり、(?=123)は「ここから先が123にマッチしている場所」をあらわす。123の部分には正規表現を入れ子にできる。

aaaaaa 123aaaaa456aaaa7890
マッチ部分

(?=123)aはマッチしない。先の例でXで置換された場所の後ろにaが来るような部分は存在しないからである。
(?=123)1はマッチする。Xで置換するとaaaaaaX23aaaaa456aaaa7890となる。ただ、普通はaa(?=123)のように正規表現の末尾に使われる。
(?!123)は「ここから先が123でない場所」である。

後読みも似たようなものである。
(?<=123)は「ここより前が123にマッチしている場所」をあらわし、先の文字列をXで置換するとaaaaaa123Xaaaaa456aaaa7890となる。

aaaaaa123 aaaaa456aaaa7890
マッチ部分

だから、先読みの時とは逆に(?<=123)aはマッチするが(?<=123)1はマッチしない。
(?<!123)は「ここより前が123でない場所」である。

先読みと後読みは、「検索の条件には必要だけれども、置換する範囲には含まない」という時に使える。