JavaScriptは肯定先読みはできるが肯定後読みはできない

JavaScriptの正規表現で該当文字列を全て抽出」について考えました。
matchで抽出した文字列に対しreplaceで無駄な部分を省く方法を使いました。
フラグ「g」を使うと必要な部分だけを抽出することができないからです。
しかし二度手間なのでスマートではありません。

「肯定先読み」を使うとあらかじめ無駄な部分を省くことができます。正規表現で「(?=パターン)」を使うとパターンに合致するか判定しますが抽出には含まれません。
しかしJavaScriptでは「肯定後読み」ができないそうです。
郵便番号を抽出する例で確認してみます。 (さらに…)

JavaScriptの正規表現で該当文字列を全て抽出

JavaScriptにはmatchという関数(メソッド)があり、正規表現を使って、主に次の二つのことができます。

  • 文字列が条件に合致しているかどうかを判定。
  • 条件に合致した文字列を抽出。

これを利用して文字列から郵便番号を抽出してみます。
郵便番号は「163-8019」のような文字列です。
「半角数字3文字」+「半角ハイフン」+「半角数字4文字」であるとします。 (さらに…)

ハングルを判定する正規表現

ハングルは全部で11172文字もあるそうです。
ハングルは基本的な記号の組合せでできているのですが、その組み合わせた結果をすべて書き出すと11172文字になるということのようです。
コンピューターの世界では文字コードとしてはAC00からD7AFに割り当てられています。
10進数だと44032から55215までです。これは11184文字分に相当します。ハングルは全部で11172文字なので収まります。 (さらに…)

JavaScriptで全角英数字を半角に変換

JavaScriptで全角英数字を半角に変換する方法を考えてみました。

全角英数字は、0から9まで、AからZまで、aからzまで、が該当します。
一方、半角英数字は、0から9まで、AからZまで、aからzまで、が該当します。
これらの文字コードを調べると次の通りです。 (さらに…)

PHPの正規表現(preg系)のパターン修飾子

PHPにはpreg_matchやpreg_replaceという関数があります。正規表現を使って検索、置換するためのものです。
これらの関数は「preg_match("/.*/i",$str)」のように使います。この「/.*/i」の「i」の部分がパターン修飾子です。
よく使うものについてまとめます。 (さらに…)

preg_matchとpreg_match_all

PHPには正規表現で文字列を検索するためのpreg_matchとpreg_match_allという関数があります。
これらについてまとめてみました。 (さらに…)

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

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行の文字列があったとします。 (さらに…)

新しい記事 | 古い記事

タグ

カテゴリー

最近の投稿

最近のコメント

固定ページ

アーカイブ

stabucky

写真

メタ情報