1. ホーム
  2. スクリプト・コラム
  3. ルビートピックス

Rubyにおける正規表現の使用に関する分析

2022-02-03 14:06:44


    文字列のテキストを見つけるだけなら、正規表現を使用しないでください: string['text'].

    単純な構造の場合は、string[/RE/] を使ってクエリを実行すればよい。

  match = string[/regexp/] # get content of matched regexp
  first_group = string[/text (grp)/, 1] # get content of captured group
  string[/text (grp)/, 1] = 'replace' # string => 'text replace'



    結果をグループ化する必要がない場合は、グループ化されていないグループを使用します。

  /(first|second)/ # bad
  /(? :first|second)/ # good



    Perl のレガシー変数をマッチの正規グループ化 (例: $1, $2, など) に使う代わりに、 Regexp.last_match[n] を代替手段として使うことができます。

  /(regexp)/ =~ string
  ...

  # bad
  process $1

  # good
  process Regexp.last_match[1]



    何を表しているのかわかりにくいデジタルな名前のグループは使用しないようにしましょう。代わりにグループに名前を付けます。

  # bad
  /(regexp)/ =~ string
  ...
  process Regexp.last_match[1]

  # good
  /(? <meaningful_var>regexp)/ =~ string
  ...
  process meaningful_var



    文字クラスには、注意すべきいくつかの特殊なキーワードがあります。そのため、.や[]の中の括弧をエスケープしないでください。]

    なお、^と$は、文字列の末尾ではなく、行頭と行末にマッチするので、文字列全体にマッチさせたい場合は、 \Aと \Zを使用します。

  string = "some injection\nusername"
  string[/^username$/] # matches
  string[/\Ausername\Z/] # don't match



    複雑な正規表現の場合は、x モディファイアを使用します。これにより、可読性が向上し、有用なコメントを含めることができます。ただ、空白文字は無視されることに注意してください。

  regexp = %r{
   start # some text
   \s # white space char
   (group) # first group
   (? :alt1|alt2) # some alternation
   end
  }x



    sub/gsubは、複雑な置換操作のためのハッシュとブロック形式の構文もサポートしています。