<?xml version="1.0" encoding="UTF-8" ?><rdf:RDF 
  xmlns="http://purl.org/rss/1.0/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xml:lang="ja">
  <channel rdf:about="http://w.atwiki.jp/regexj/">
    <title>高速正規表現エンジンを１から作りたい @ 2ch</title>
    <link>http://w.atwiki.jp/regexj/</link>
    <atom:link href="https://w.atwiki.jp/regexj/rss10.xml" rel="self" type="application/rss+xml" />
    <atom:link rel="hub" href="https://pubsubhubbub.appspot.com" />
    <description>高速正規表現エンジンを１から作りたい @ 2ch</description>

    <dc:language>ja</dc:language>
    <dc:date>2012-03-07T21:36:40+09:00</dc:date>
    <utime>1331123800</utime>

    <items>
      <rdf:Seq>
                <rdf:li rdf:resource="https://w.atwiki.jp/regexj/pages/18.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/regexj/pages/17.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/regexj/pages/16.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/regexj/pages/15.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/regexj/pages/14.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/regexj/pages/13.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/regexj/pages/12.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/regexj/pages/11.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/regexj/pages/10.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/regexj/pages/9.html" />
              </rdf:Seq>
    </items>
	
		
    
  </channel>
    <item rdf:about="https://w.atwiki.jp/regexj/pages/18.html">
    <title>ひとりでもできるもん</title>
    <link>https://w.atwiki.jp/regexj/pages/18.html</link>
    <description>
      NHK教育でそんな番組があったような気がしますが、一度も見たことは無いんで内容は知りませんが、そんな気分です。
まだ空のクラス、スタブばかりですが、リポジトリを作って順調に開発を進めております。
なお面白い実験結果があり次第このサイトにて報告致します。

今のところ協力者募集を呼びかけても反応が無いので、無節操にオープンにする必要性は感じられません。（最終的には全て公開する予定ですが）
リポジトリのロケーション及びパスワードに関してご興味のある方は私宛にお問い合わせ下さい。 
(上部メニューのツールのこのウィキの管理者に連絡からお願い致します。)    </description>
    <dc:date>2012-03-07T21:36:40+09:00</dc:date>
    <utime>1331123800</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/regexj/pages/17.html">
    <title>大雑把な発想</title>
    <link>https://w.atwiki.jp/regexj/pages/17.html</link>
    <description>
      [[単純な発想]]でパターンをアスタリスク*で分割する方法に可能性を見出しました。
  R（パターン)の値が十分に小さいならば分割できる
しかしアスタリスクの他に*? *+ + +? ++ {n} {n}? {n}+ {n,} {n,}? {n,}+ {m,n} {m,n}? {m,n}+などが有る事を忘れていました。
ですが工夫すればアスタリスクに還元できるとおおざっぱに考えます。
以上で本エンジンの性能が指数オーダーから線形オーダーになった気になりました。
え？そんな安直な！というご批判には答えていくつもりです。

次に分割されたパターンの事を考えます。[[前回の実験&gt;既存の物を超えられるか？]]では簡単な単語を用いましたが、
実際のパターンのバリエーションは無限なので困ってしまいます。
具体的に考えていきます。
  (?:(?:abc)|(?:edfg))
パターンのＯＲですが、これは合成して１つの単語にする方法がありそうです。
  [a-z]
なども同様の合成方法がありそうです。
  (?:(?:\s*abc)|(?:(?:\s*cde)*))
あまり複雑なときは場合分けするのが妥当ですが、
この程度ならabcとcdeを合成したものを検索して先に現れた方から調べるという工夫ができそうです。
なおR((?:\s*cde)*)の値は十分大きいので分割は考えなくて良さそうです。
  (?:abc)?(?:def)?(?:ghi)?
これもabc　def　ghiを合成して検索することができそうです。
これらの例の合成方法はバケットを用いれば簡単に実装できますが、
もっと複雑なパターンには別の方法を組み合わせます
、これも明らかにしていきます。

パターンを合成して扱う考え方はオートマトンと等価なんじゃないか？という感じもしますが、無かったことにします。
かわりに検索アルゴリズムの拡張版を使う予定です。

おおざっぱなままですが、明日から調査用のプログラムを作り始めます。    </description>
    <dc:date>2012-03-05T00:12:04+09:00</dc:date>
    <utime>1330873924</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/regexj/pages/16.html">
    <title>単純な発想</title>
    <link>https://w.atwiki.jp/regexj/pages/16.html</link>
    <description>
      先日&amp;bold(){.*} で単語を分割して効率が良くなる実験をしました。
そんな安易な発想で行けるわけねーだろｗｗｗｗｗｗと切り捨てた方もいたと思いますｗ
自分も安易だと思いましたが愚直に延長線上を進みます。
ではアスタリスク * がついているところで分割すればいいのか？それともダメなのか？
と考えてみます。結論を先に言えばＹＥＳ＆ＮＯです。
具体的には &amp;bold(){.*} では良かったが &amp;bold(){w*} ではダメっぽい。
これら２つは長さに対する出現頻度の傾向が違うように感じます。
つまりパターン &amp;bold(){w*} は以下とマッチしますが
  wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
wが連続するほどこの単語は出現頻度は低くなる。
&amp;bold(){w*} は単語として扱った方が良く分割には適さないと思えます。

別の正規表現も考えてみます &amp;bold(){[^w]*} というのは &amp;bold(){.*} と似た傾向があるように感じます。
  [^w]*はwを検索して無い事を調べる操作が加わった .* と見なせる。
こう考えることで[^w]*の部分で分割でき、線形オーダーへの効率化が期待できます。

以上説明のために出現頻度という言葉を用いましたが、マッチする組み合わせの数で説明する方法もあったでしょう。
何か名称を与えた方がいいかもしれません。
  R( .*)=0
  R(a*)=1
仮にこうしておきます。    </description>
    <dc:date>2012-03-03T21:35:41+09:00</dc:date>
    <utime>1330778141</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/regexj/pages/15.html">
    <title>既存の物を超えられるか？</title>
    <link>https://w.atwiki.jp/regexj/pages/15.html</link>
    <description>
      #tag_cloud(sort=num)
直観で行けそうだなと思いました。
根拠は？という事ですが、根拠を脳内から掘り起こす作業も１からです。

とりあえず１つ調査してみました。
  .*単語.*単語.*単語.*単語.*単語.*単語.*単語.*単語.*単語.*単語.*
  ランダムな２文字の単語が１０個並んだもの。これと１万文字とのマッチングをしてみた。
  java.util.regexとの比較で
  ５千～２万倍早くなった、これは上限に過ぎないが見込はありそうだ。
  発想は極めて幼稚で、.*のところで分割すればいいじゃないかというもの。 
指数オーダーと線形オーダーとで優劣は明白でした。
(&amp;bold(){.*}で連結されたパターンというのは実用上頻繁にみられるものです）
ただしこの大差はマッチングに失敗する事が多い例だからです。
もっと簡単な例で成功する場合は１０倍程度に収まる事もあります。

以下はプログラムの一部です。
（&amp;bold(){.*}で分割したパターン要素を保持するパターン要素）
とりあえずjavaで開発を進めます。HaskellやC++で書きたい欲望は今は抑えます。
----
  public class Floating implements PatternElement{
    ArrayList&lt;PatternElement&gt; eee=new ArrayList();
    public void add(PatternElement e){
      eee.add(e);
    }
    @Override
    public int find(String txt,int pointer){
      int ret=-1;
      for(PatternElement e: eee){
        int f=e.find(txt,pointer);
        if(f==-1)return -1;
        if(ret==-1)ret=f;
        pointer=f+e.getMod();
      }
      return ret;
    }
    @Override
    public int     </description>
    <dc:date>2012-03-03T15:09:39+09:00</dc:date>
    <utime>1330754979</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/regexj/pages/14.html">
    <title>進捗状況</title>
    <link>https://w.atwiki.jp/regexj/pages/14.html</link>
    <description>
      20120302 調査プログラムを作成した
20120303 このWikiを立ち上げた
20120303 [[単純な発想]]を追加した
20120304 [[大雑把な発想]]を追加した
20120307 [[ひとりでもできるもん]]を追加した    </description>
    <dc:date>2012-03-04T22:50:07+09:00</dc:date>
    <utime>1330869007</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/regexj/pages/13.html">
    <title>開発方針について</title>
    <link>https://w.atwiki.jp/regexj/pages/13.html</link>
    <description>
      **とにかく現物を速くすることが第一
そのかわり開発が遅くなるというトレードオフが成り立つかもしれません。
----
+プログラムの構造、アルゴリズムなどを提案
+速くなる根拠のための調査、実験(プログラミング)
これの繰り返しだと思います。暗中模索とも言います。
----

**現時点での開発タスク 
-調査、実験
-大枠、骨組みの作成
-中間言語への字句解析の作成

**開発予定
３ヶ月くらいかけてのんびりやろうと思っています。    </description>
    <dc:date>2012-03-03T15:50:39+09:00</dc:date>
    <utime>1330757439</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/regexj/pages/12.html">
    <title>プラグイン/人気商品一覧</title>
    <link>https://w.atwiki.jp/regexj/pages/12.html</link>
    <description>
      * 人気商品一覧
@wikiのwikiモードでは
 #price_list(カテゴリ名)
と入力することで、あるカテゴリの売れ筋商品のリストを表示することができます。

カテゴリには以下のキーワードがご利用できます。
|キーワード|表示される内容|
|ps3|PlayStation3|
|ps2|PlayStation3|
|psp|PSP|
|wii|Wii|
|xbox|XBOX|
|nds|Nintendo DS|
|desctop-pc|デスクトップパソコン|
|note-pc|ノートパソコン|
|mp3player|デジタルオーディオプレイヤー|
|kaden|家電|
|aircon|エアコン|
|camera|カメラ|
|game-toy|ゲーム・おもちゃ全般|
|all|指定無し|

空白の場合はランダムな商品が表示されます。

※このプラグインは[[価格比較サイト@PRICE&gt;&gt;http://atprice.jp]]のデータを利用しています。

-----

たとえば、
 #price_list(game-toy)
と入力すると以下のように表示されます。

ゲーム・おもちゃ全般の売れ筋商品
#price_list(game-toy)

ノートパソコンの売れ筋商品
#price_list(game-toy)

人気商品リスト
#price_list()
    </description>
    <dc:date>2012-03-03T00:54:02+09:00</dc:date>
    <utime>1330703642</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/regexj/pages/11.html">
    <title>プラグイン/コメント</title>
    <link>https://w.atwiki.jp/regexj/pages/11.html</link>
    <description>
      * コメントプラグイン
@wikiのwikiモードでは
 #comment()
と入力することでコメントフォームを簡単に作成することができます。
詳しくはこちらをご覧ください。
＝＞http://atwiki.jp/guide/17_60_ja.html


-----
たとえば、#comment() と入力すると以下のように表示されます。

#comment    </description>
    <dc:date>2012-03-03T00:54:02+09:00</dc:date>
    <utime>1330703642</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/regexj/pages/10.html">
    <title>プラグイン/関連ブログ</title>
    <link>https://w.atwiki.jp/regexj/pages/10.html</link>
    <description>
      * 関連ブログ
@wikiのwikiモードでは
 #bf(興味のある単語)
と入力することで、あるキーワードに関連するブログ一覧を表示することができます

詳しくはこちらをご覧ください。
＝＞http://atwiki.jp/guide/17_161_ja.html

-----


たとえば、#bf(ゲーム)と入力すると以下のように表示されます。


#bf(ゲーム)
    </description>
    <dc:date>2012-03-03T00:54:02+09:00</dc:date>
    <utime>1330703642</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/regexj/pages/9.html">
    <title>プラグイン</title>
    <link>https://w.atwiki.jp/regexj/pages/9.html</link>
    <description>
      @wikiにはいくつかの便利なプラグインがあります。

-----


#ls

-----

これ以外のプラグインについては@wikiガイドをご覧ください
=&gt;http://atwiki.jp/guide/
    </description>
    <dc:date>2012-03-03T00:54:02+09:00</dc:date>
    <utime>1330703642</utime>
  </item>
  </rdf:RDF>
