タグ

Rubyとregexに関するtmsanrinshaのブックマーク (3)

  • 鬼雲に非包含オペレータを実装した話 - Qiita

    概要 田中哲さん(@tanaka_akr)が以前提案された「非包含オペレータ」というものを(実験的に)鬼雲に実装しました。これを使うと例えば C 言語のコメントにマッチする正規表現などが簡単に書けるようになります。 ここでは、非包含オペレータとは何か、また今後の見通しなどについて説明します。 非包含オペレータとは? 非包含オペレータは田中さんが約 9 年前に発表された、正規表現の拡張です。理論的背景と実装例は以下のスライドと論文に示されています。 正規表現における非包含オペレータの提案 Absent Operator for Regular Expression 従来の正規表現では、「特定の文字以外の 1 文字にマッチする正規表現」は文字クラスの否定を使って [^x] のように書くことができますが、それに対して「特定の文字列を含まない文字列にマッチする正規表現」は簡単に書くことはできません

    鬼雲に非包含オペレータを実装した話 - Qiita
  • Rubyの正規表現で対応する括弧を考慮していい具合にマッチさせる - There's an echo in my head

    1.9以降に搭載された正規表現エンジン(oniguruma, onigumo)では (?<name>式)によってマッチした式部分に名前(ここではname)を付けることができ、 それにマッチした内容を後方参照\k<name>で参照でき、 また\g<name>でその式を再帰的に呼び出すことができる これを使えば、括弧のペアを対応させた上でマッチさせることができる。 たとえば次の例ではLispのシングルクォーテーション記法をquote関数の呼び出しに変換する。 regexp = /'(?<paren>\((?:[^()]|\g<paren>)*\))/ replace = '(quote \k<paren>)' # 1段 "'(+ 1 2)".match(regexp) #=> #<MatchData "'(+ 1 2)" paren:"(+ 1 2)"> "'(+ 1 2)".gsub(reg

    Rubyの正規表現で対応する括弧を考慮していい具合にマッチさせる - There's an echo in my head
  • 正規表現によるバリデーションでは ^ と $ ではなく \A と \z を使おう

    正規表現によるバリデーション等で、完全一致を示す目的で ^ と $ を用いる方法が一般的ですが、正しくは \A と \z を用いる必要があります。Rubyの場合 ^ と $ を使って完全一致のバリデーションを行うと脆弱性が入りやすいワナとなります。PerlPHPの場合は、Ruby程ではありませんが不具合が生じるので \A と \z を使うようにしましょう。 はじめに 大垣さんのブログエントリ「PHPer向け、Ruby/Railsの落とし穴」には、Rubyの落とし穴として、完全一致検索の指定として、正規表現の ^ と $ を指定する例が、Ruby on Rails Security Guideからの引用として紹介されています。以下の正規表現は、XSS対策として、httpスキームあるいはhttpsスキームのURLのみを許可する正規表現のつもりです。 /^https?:\/\/[^\n]+$/

  • 1