複数のプログラミング言語で正規表現を使いまわそうとしたら \p{...} (Unicodeプロパティエスケープ)の互換性がよくわからなかったのでメモ。 概要 下表のように、ECMAScript, .NET (C#), Javaでは \p{カテゴリ名} 形式のGeneral Cateogry指定以外の記法は三者に互換性がない。 Unicodeプロパティ ECMAScript .NET Java
最近Packetbeatのプラグインを作っている中でGolangを書いてますが、Golangといえば正規表現が遅いとよく聞きますがほんとに遅いのかを試してみました。 今回はみんな大好きPythonと比較。 きっと言語それぞれに得意なケース、得意でないケースがあるかとは思いますが、 あくまでも実用コードの比較ということで・・・ 入出力 SIPのname-addrをパースする正規表現の実行速度を比較したいと思いいます。 "Display-name"<sip:0312341234@10.0.0.1:5060>;tag=tag12345678といった入力の時に以下のように分解する正規表現を試します。 Display-name sip 0312341234 10.0.0.1 5060 tag=tag12345678 Golangのコード package main import ( "fmt" "re
κeenです。Rubyでも使われてる高速な正規表現エンジン、Onigmo(鬼雲)を高速化したのでその話を。 先日、正規表現技術入門を読んだというエントリの中で ところで本に載ってた鬼雲のコードはDT(編注: Direct Threaded)にしてなかったけど簡単のためなのかな?あるいは厳格にC89に準拠するため?picrinみたくプリプロセッサで分岐すれば使えるのに。 と書いたところ、鬼雲の作者、K.Takataさんから @k_takata 「picrinみたくプリプロセッサで分岐すれば使えるのに。」これも知らなかった。 — K.Takata (@k_takata) 2015, 5月 11 という反応を頂きました。そしてイシューにも乗ったので言い出しっぺとして実装してみました。こちらのプルリクです。 Direct Threaded VM自体の解説はRubyist Magazineに載ってい
Excamera Labs is the home of: The popular Gameduino series of graphics and gaming adapters The I²CDriver and SPIDriver USB protocol tools The J1 Forth CPU The Excamera Labs newsletter is sent out every Tuesday. In it I talk about the latest projects, launches and previews. You can subscribe here. Gameduino CircuitPython March 2021 Crossbars in CuFlow February 2021 Forth double loops September 2020
Here are two examples that persuaded me long ago that regular expressions could be powerful. Both come from The Unix Programming Environment by Kernighan and Pike (1984). The first problem is to produce a list of all English words that contain all five vowels exactly once and in alphabetical order. The book creates a regular expression aphavowels ^[^aeiou]*a[^aeiou]*e[^aeiou]*i[^aeiou]*o[^aeiou]*u
題の通りです。 ブラウザって言うと語弊があって、正確にはHTMLレンダリングエンジンを作ろうとしていました。 Webkit、Geckoなどに相当するものですね。 経緯 最近、MozillaがServoという新しいレンダリングエンジンを開発しているのはご存知でしょうか。 並列性やパフォーマンスを重視しているそうで、どんな実装になっているか興味を持つのは当然ですよね。 まだ若いプロジェクトだし、自分でも理解出来るんじゃないかと思ってソースコードを読んだりもしました。 まあ、ほとんど理解出来ませんでしたけどね!そもそもRustの知識が足りなかった……。 そして、とりあえず自分でレンダリングエンジンっぽいものを実装してみようと考えました。 Rustは追々勉強して行くということで、その構造だけでも理解してやろうというわけです。 言語は最近ハマったCommon Lispで書こうということで始まりました
特定コマンドの正規表現で使えるメタ文字が何だかわからない! 正規表現自体は知っているけど、それが今から使おうとしているコマンドで使えるものなのかわからずに困っている人も多いと思うのでまとめてみた。 たった3つの正規表現メタ文字セットだけ知ればいい コマンドによって、対応している正規表現メタ文字の範囲には違いがある。しかし、最低限知っておけばよいのは2種類+1サブセットの3つだけだ。 BRE(基本正規表現)メタ文字セット ERE(拡張正規表現)メタ文字セット AWKのサブセット もちろん、これ以外にもGNU拡張正規表現メタ文字セットやPerl拡張正規表現メタ文字セット、JavaScript拡張正規表現メタ文字セットなどいくつかあるのだが、「どのUNIXでも(=POSIXで)使える」という特長を持たせたいのであれば、それらは覚えても意味がないので上記の3つさえおさえておけばよい。(例えPOSI
高速かつ省メモリなGoogleの正規表現ライブラリ re2 についてのメモ。 RE2は、PCRE や Perl や Python で使われているようなバックトラッキング正規表現エンジンの代替となる、高速で、安全で、スレッド・フレンドリーなC++ライブラリです。 バックトラッキング・エンジンは一般に機能や便利なシンタックスシュガーが満載ですが、小さな入力に対してさえも指数関数的に時間がかかる羽目に陥ることがあります。RE2はオートマトン理論を用い、正規表現検索が入力のサイズに対し線形の時間内に走ることを保証しています。 検索を固定量のメモリに制約できるように、RE2はメモリ制限を実装しています。 どのような入力もしくは正規表現を処理しなくてはならないとしても、小さな固定のC++スタック量のみ使用するようRE2は設計されています。そのため、RE2はスレッドスタックを任意に拡げられないマルチスレ
文字列検索 re.search(pattern, string) 文字列の中から最初に一致する部分を探す patternの先頭のrはraw stringの意味で、backslashをそのままsearchに渡してくれる。 In [11]: import re In [12]: str = 'Less but better' In [13]: match = re.search(r'\s\w\w\w\s',str) In [14]: print 'found:', match.group() found: but
\x{} \pは後続する名前が表すクラス(プロパティ、スクリプト、ブロック)に属する文字にマッチし、 \Pは後続する名前のクラスに属さない文字にマッチします。 クラスの名前が一文字のときはブレースを省略できます。 クラス名の前に^を置くことにより否定形の指定を行うことも可能です。 Perl 5.8 での変更点 Perl5.8以降(5.6でも使えたようですが)では \pや\Pで始まるプロパティ指定に標準Unicode属性を使うこともできます。 詳しくは perlunicode perlunicode - Perl における Unicode サポート を参照してください。 日本語による説明が Unicodestandard にもあります。 Perl 5.8以降ではユーザーが任意のプロパティを作成することができます (IsまたはInを必ず前置)。 詳しくは perlunicode perluni
A Play on Regular Expressions 最後まで読みました. 対話的に書かれていて読みやすかったのと, ソースコードがほとんどそのまんま動いたため楽しかったです. 正直言って, 正規表現のエンジン書いたのは初めてでした. この論文の素晴らしい所は, そんなぼくでも, ACT1を読むだけで, 取り敢えずなんか動くエンジンが作れてしまうことですね. ただ, 指数関数的にメモリーを食うからがんばろうって言ってACT2に続くわけですが... ACT2からもすごく良かった. Semiringを使って正規表現の返す値を一般化する方法は, とても美しく, 気持よかったです. そして, 最終章のLazinessにきた時, 興奮が収まりませんでした. 少しコード貼っておきます. 最初に出てくる, 正規表現を表すデータ型はこんな感じです. data Reg = Eps | Sym Char
正規表現技術入門という本の中に、正規表現のJITコンパイルという技術が紹介されている。VM型の正規表現エンジンは以前作った1ので、これをLLVMへコンパイルすればおもしろいのではないかと考えて、実行することにした。なお、実装にはScalaを用いた。 追記: また、JVMのバイトコードへJITコンパイルする実験も書きました。 正規表現のJITコンパイラを実装する 正規表現の抽象構文木 VMの実装の時に用いたものと同じく、次のデータ構造を用いる。 sealed trait Regex case object Empty extends Regex case class Let(c: Char) extends Regex case class Con(a: Regex, b: Regex) extends Regex case class Alt(a: Regex, b: Regex) ext
llvmrubyのサンプルで何か作りたいなと思い、正規表現コンパイラを作ろうと思い立ちました。 調べてみたらomoさんがllvmで正規表現コンパイラを作っていましたhttp://www.dodgson.org/omo/t/?date=20071215。これをllvmrubyに移植しようと思ったのですが、コードを読んでも全然わからない。 昔のオートマトンの講義(確か単位落としたような気がする)を思い出して自分で作ってみました。何か、就職できなくて自分で会社を作ったのび太のような気分です。 正規表現は必要最低限のものだけです * 0回以上の繰り返し . 任意の文字 \文字 エスケープ(文字列で表すので実際には\\と入力する必要があります。)llvmにコンパイルする版を作る前に、Rubyにgotoを入れたRuby66にコンパイルするようにしてみました。 例えば、 ".*cc\\*dd*a"は次の
Wadlerのパクリ。というか劣化コピー。 悪魔:「あなたが私と契約してくれたら、(A)『私があなたに一億円をあげる』、(B)『あなたが私に一億円をくれたら、どんな願いでもかなえてあげる』のどちらかをして差し上げます。(A)と(B)のどちらにするかは、私が決めます。」 人間:「どちらにせよ害はなさそうなので、じゃあ契約します。」 悪魔:「はい、では私は(B)を選びます。」 人間:「やっぱりそう来るか。でも一億円なんて持ってないし、まあいいや。」 (十年後) 人間:「気になってしょうがないので、悪いことをして一億円を集めました。だから願いをかなえてください。」 悪魔:「そりゃどうも(と一億円を受け取る)。では私は(A)を選びます。はいどうぞ(と一億円を返す)。」 ICFP 2003の会場ではWadlerとShiversが壇上で寸劇をやりました(本当)。λ式で書くと callcc(λk:¬(T
正規表現によるバリデーション等で、完全一致を示す目的で ^ と $ を用いる方法が一般的ですが、正しくは \A と \z を用いる必要があります。Rubyの場合 ^ と $ を使って完全一致のバリデーションを行うと脆弱性が入りやすいワナとなります。PerlやPHPの場合は、Ruby程ではありませんが不具合が生じるので \A と \z を使うようにしましょう。 はじめに 大垣さんのブログエントリ「PHPer向け、Ruby/Railsの落とし穴」には、Rubyの落とし穴として、完全一致検索の指定として、正規表現の ^ と $ を指定する例が、Ruby on Rails Security Guideからの引用として紹介されています。以下の正規表現は、XSS対策として、httpスキームあるいはhttpsスキームのURLのみを許可する正規表現のつもりです。 /^https?:\/\/[^\n]+$/
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く