2009年9月26日土曜日

JavaScript で正規表現

JavaScript で正規表現を使いたい。

JavaScript: The Good Parts (p75) によると、

4873113911JavaScript において正規表現が利用できるメソッドは、regexp.exec, regexp.test, string.match, string.replace, string.search, string.split である。

RegExp, string ごとにメソッドを整理。

RegExp

string

  • exec
  • test
  • match
  • replace
  • search
  • split
  •  

    String.match

    String オブジェクトの match メソッドを試す。

    "abcdef123".match(/(b.).*(\d{3})/)

    結果は、

    ["bcdef123", "bc", "123"]

    match – MDC によると、

    正規表現が g フラグを含んでいない場合、regexp.exec(string) と同じ結果を返します。

    exec メソッドは、

    特定の文字列でのマッチのための検索を実行します。結果の配列、あるいは、null が返ります。

    結果として返される配列の中身は、

    [1], ...[n]
    括弧で囲まれた部分文字列のマッチ。括弧で囲まれた部分文字列の数に制限はありません。

    (同上より)

     

    例えば、

    Google の検索において、検索した文字列を取得したい。

    Google で検索した後のURL を見ると、クエリ文字列のパラメータ q の値が検索文字列のようなので、

    decodeURIComponent(location.search.match(/q=(.*?)&/)[1]);

     

    location.search と decodeURIComponent

    上記 location.search は「JavaScript で URL からフラグメント以外を取得」を参照。

    decodeURIComponent メソッドは、

    エンコードされた URI の要素内のエスケープシーケンスをそれぞれが表す文字に置き換えます。

     

    最左最短一致

    正規表現における

    .*?

    はの意味は、

    量指定子の後ろに?を付けると、最短でマッチさせます。この最左最短一致を「なまけもの(non-greedy)マッチ」とも言います

    (量と位置を指定する via Yahoo! Pipes で、RSS を出力してないサイトをRSS化する より)