<?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/2.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/regexj/pages/17.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/regexj/pages/14.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/regexj/pages/16.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/regexj/pages/1.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/regexj/pages/3.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/regexj/pages/13.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/regexj/pages/15.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/regexj/pages/4.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/2.html">
    <title>メニュー</title>
    <link>https://w.atwiki.jp/regexj/pages/2.html</link>
    <description>
      **&amp;bold(){&amp;italic(){MENU}}
-[[トップページ]]
-[[開発方針について]]
-[[既存の物を超えられるか？]]
-[[単純な発想]]
-[[大雑把な発想]]
-[[ひとりでもできるもん]]
-[[進捗状況]]
-[[要望など]]

----

**リンク
-[[ム板フレームワークスレ&gt;&gt;http://toro.2ch.net/test/read.cgi/tech/1327674081/]]
-[[形式言語preferred　research&gt;&gt;http://research.preferred.jp/category/%E5%BD%A2%E5%BC%8F%E8%A8%80%E8%AA%9E/]]

**他のサービス
-[[無料ホームページ作成&gt;&gt;http://atpages.jp]]
-[[無料ブログ作成&gt;&gt;http://atword.jp]]
-[[2ch型掲示板レンタル&gt;&gt;http://atchs.jp]]
-[[無料掲示板レンタル&gt;&gt;http://atbbs.jp]]
-[[お絵かきレンタル&gt;&gt;http://atpaint.jp/]]
-[[無料ソーシャルプロフ&gt;&gt;http://sns.atfb.jp/]]

//**更新履歴
//#recent(20)

&amp;link_editmenu(text=ここを編集)    </description>
    <dc:date>2012-03-07T21:35:35+09:00</dc:date>
    <utime>1331123735</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/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/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/1.html">
    <title>トップページ</title>
    <link>https://w.atwiki.jp/regexj/pages/1.html</link>
    <description>
      *超高速正規表現エンジンを１から作りたい！
しかも学術知識無しで？！という無謀なプロジェクトです。
全く何も知らないわけではないのですが、頭空っぽの方が夢詰め込めるという言い伝えに従います。
（情報工学や数学的視点からのご批判は歓迎致します。）
本サイトは自作を指南する内容ではないのでご理解下さい。
ですが成果物に関しては広く公開するつもりです。
ご興味のある方のご要望、ご批判は承っております。

このプロジェクトは２ｃｈに書き込んだところから始まりました。[[参考URL&gt;http://toro.2ch.net/test/read.cgi/tech/1327674081/121-138]]
ご指摘があったようにまず
**既存の物より速くなる見込みがあるのか？
ということです。これを明らかにしていく作業も&amp;bold(){&amp;u(){１から}}という無謀さですがご容赦下さい。

***要求仕様
+この仕様を満たすこと→[[java Pattern&gt;http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/util/regex/Pattern.html]]
+線形オーダーであること
+巨大データを扱えること
+逆方向に検索できること
+強制失敗できること

本プロジェクトの当面の目標はjava.util.regexです。そしてgoogle re2と比較する予定です。

開発にはリポジトリを使用する予定ですので
参加される方はご登録をお願い致します。

ご興味のある方のご指摘ご支援を募集致しております。    </description>
    <dc:date>2012-03-03T20:46:01+09:00</dc:date>
    <utime>1330775161</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/regexj/pages/3.html">
    <title>右メニュー</title>
    <link>https://w.atwiki.jp/regexj/pages/3.html</link>
    <description>
      **更新履歴
#recent(20)


&amp;link_editmenu2(text=ここを編集)&amp;counter(total)    </description>
    <dc:date>2012-03-03T19:51:29+09:00</dc:date>
    <utime>1330771889</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/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 getMod() {
      return 1;
    }
  }
----
この実験のメインループはfind内ですが
アルゴリズムも使っておらず何の変哲もなく面白みもありませんが
１重ループなので線形オーダーです。
なおパターンからPatternElementへの字句解析は省略しています。

次に他のパターンの事も考えてみます。    </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/4.html">
    <title>プラグイン/ニュース</title>
    <link>https://w.atwiki.jp/regexj/pages/4.html</link>
    <description>
      * ニュース
@wikiのwikiモードでは
 #news(興味のある単語)
と入力することで、あるキーワードに関連するニュース一覧を表示することができます
詳しくはこちらをご覧ください。
＝＞http://atwiki.jp/guide/17_174_ja.html


-----


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


#news(wiki)
    </description>
    <dc:date>2012-03-03T00:54:02+09:00</dc:date>
    <utime>1330703642</utime>
  </item>
  </rdf:RDF>
