複数行にマッチさせる正規表現

JavaScriptで複数行にマッチさせる方法が分かりません。

やむを得ず次のように改行を「@」などの文字に変換してからマッチさせていました。

moto=moto.replace(/\n/g,"@");
saki=moto.match(/.*/);

これだと文字列に元々「@」が含まれているとアウトです。

「.*」だと複数行にマッチしないのは「.」が「改行を除く任意の1文字」を表すためです。
そこで次のようにします。

saki=moto.match(/(\n|.)*/);

「改行」または「改行を除く任意の1文字」となってマッチします(「\r」を含める場合もあるかもしれません)。

このように悩んでいたのですが、スマートな解決策がありました。それもマイクロソフトのサイトに。

「.」
'\n'を除く任意の1文字に一致します。'\n'を含めて任意の文字と一致させるには、'[\s\S]'などのパターンを指定します。

よく見ているページなのに見落としていました。
つまり次のようにすればよいのです。

saki=moto.match(/[\s\S]*/);

マイクロソフトの説明は次の通りです。

「\s」
空白、タブ、フォーム フィードなどの任意の空白文字と一致します。[ \f\n\r\t\v]と同じ意味です。
「\S」
空白文字以外の任意の文字と一致します。[^ \f\n\r\t\v]と同じ意味です。

「\s」が改行文字などを含む空白文字、「\S」が「\s」以外の任意の文字というわけですから、両方を使えば「改行を含む任意の1文字」となります。

なお、本件に関して、フラグに「m」を使う方法はJavaScriptではうまくいきません。

正規表現におけるハイフンの挙動

「-」を「ハイフン」と読みますが、年配の人だと「ハイフォン」と読む人が多いようです。
英語の発音記号を見るとどちらでも正しいようですが、「ハイフォン」だとベトナムの都市を思い浮かべてしまうので、私は「ハイフン」と読んでいます。

正規表現におけるハイフンは「○から○まで」という範囲を指定するときに使えてとても便利ですが、この挙動について勘違いしていたので、調べてみました。JavaScriptです。

「a-b-c」という文字列に対して正規表現「[a-c]」を使ってみます。

x="a-b-c";
y=x.match(/[a-c]/g);
z=y.join(",");

この場合、結果(z)は「a,b,c」となりました。
同じようにして色々と試してみます。

正規表現 結果
a-b-c [a-c] a,b,c
a-b-c [a-] a,-,-
a-b-c [-c] -,-,c
a-b-c [a-c-] a,-,b,-,c

つまり[○-○]という形で使った場合は「○から○まで」という意味になりますが、これ以外では単に「-」という文字そのものを表すということになるようです。
[a-c]⇒a,b,c
[a-]⇒a,-
[-c]⇒-,c
[a-c-]⇒a,b,c,-

実は、今までハイフン(「-」)を指定するには「\-」としていたのですが、実際は「\」は不要でした。

単語の先頭だけを大文字にする

ExcelにはPROPERというワークシート関数があり、英文の各単語の先頭を大文字に、その他の文字を小文字に変換することができます。
これをJavaScriptで行うための関数を考えてみました。

function proper(str){
  return str.replace(/\b([a-z])([a-z']*)\b/gi,function($0,$1,$2){
    return $1.toUpperCase() + $2.toLowerCase();
  });
}

単語を取り出すために正規表現として単語の切れ目を表す「\b」を使うのがポイントでしょうか。
シングルクォーテーションは「I'm」などに対応するためです。

JavaScriptのmatchでマルチラインフラグを使う

複数行の文字列に対してJavaScriptのmatchを適用する場合について考えます。
次のような3行の文字列があったとします。 (さらに…)

「同じ文字が2個並んだ文字列」の正規表現

「book」の「oo」のように文字の繰り返しを見付ける正規表現について調べました。

JavaScriptの場合

まず/.{2}/という表現を思い付きますが、これでは「同じ文字が2個並んだ文字列」になりません。単に「文字が2個並んだ文字列」です。1個目と2個目の文字が異なってもよいからです。
そこで次のようにします。

str="book";
ret=str.match(/(.)\1/g);

「oo」が返されます(正確にはret[0]として)。
JavaScriptの正規表現では「\1」を使うと括弧に挟まれた部分を取得できます。
/(.)/とすると任意の1文字が取得でき、\1に格納されます。
/(.)\1/とすると/\1\1/のように「同じ文字が2個並んだ文字列」を探すことになります。

秀丸の場合

検索文字列として「(.)\1」を指定します。
もちろん正規表現にチェックを入れます。
もし「同じ文字が2個以上並んだ文字列」を検索するならば「(.)\1+」とするとよいでしょう。
「ぱみゅぱみゅ」のように「同じ文字列が2回並んだ文字列」ならば「(.+)\1」だとうまくいきます。

Writerですべてのアルファベットを検索

Wordで、全角・半角、大文字・小文字のすべてのアルファベットを検索するには次のようにします。

  1. 検索と置換ダイアログを開く。
  2. 検索する文字列に「[a-zA-Za-zA-Z]」とセットする。
  3. 検索オプションを開く。
  4. ワイルドカードを使用するにチェック。
  5. 検索を実行。

同じことをOpenOffice Writerで行います。 (さらに…)

Excelで正規表現による置換

Excelで正規表現を使った置換を行うためのユーザー定義関数を作ってみました。
引数の順番は言語によって異なりますが、Excel風にしました。
裏でVBScriptを使っていますので、正規表現はそれに準拠します。
ここでは正規表現そのものについては説明を省きます。 (さらに…)

新しい記事

タグ

カテゴリー

最近の投稿

最近のコメント

固定ページ

アーカイブ

stabucky

写真

メタ情報