【javascript】 RegExp 正規表現

よく ”20161216010203″.replace(/([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})/g,”$1/$2/$3 $4:$5:$6″);
などどダラダラな使い方をしてしまうと
もう正規表現とはいいがたい。
var reg = new RegExp(”\(\[0-9\]\{4\}\)\(\[0-9\]\{2\}\)\(\[0-9\]\{2\}\)\(\[0-9\]\{2\}\)\(\[0-9\]\{2\}\)\(\[0-9\]\{2\}\)”, “g”);
var mat = reg.exec(“20161216010203”);
しかもパターンをjavascriptのリテラルとして指定するとエスケープシーケンスで更に長くなって訳が分からなくなる。
字句解析した部分:mat[0]、年:mat[1]、月:mat[2]、時:mat[3]、分:mat[4]、秒:mat[5]
など・・・となるはずなんだけどなぁ・・・
その度にスクラッチするのも面倒なのでデバッガを作ってみた。

ちまちましたパターンのデバッグに丁度いい。

複数のパターンを書けば、 | で繋いで、字句解析する様になっているものの・・・
パターンの長いものを先に書かないと、短いパターンが優先してマッチングしてしまい不調。
各パターンが括弧で括る(・・・)なパターンを想定しているので、上の様な場合は、複数のパターンを書くと、うまくいかないので、
デバッグ・ログ出力のチェックボックスを追加した。
これで、$0,$1,$2・・・$n の出力の雰囲気も判るハズ。

で、VisualStudioのC#のForm1.Designer.csを読取り
1つづつトークンと正規表現を増やしていく・・・
COMMENT:    (/{2}.*$|/\*.*\*/)
REGION_B:   (\s*#region\s+[a-zA-Z0-9]+.*$)
REGION_E:   (\s*#endregion$)
SPACE:      ([\s]+)
L-BRACE:    (\{)
R-BRACE:    (\})
L-PAREN:    (\()
R-PAREN:    (\))
COMMMA:     (\,)
DOT:        (\.)
BINOP:      (\|\||&&|!=|==|\+|<=|>=|-|\*|\/|%|=)
DELIMITER:  (;)
NULL:       (null)
VALUE_TYPE: (void|integer|bool|string)
SCOPE:      (public|private|friend|static)
THIS:       (this)
NEW:        (new)
BOOL:       (true|false)
SYMBOLE:    ([a-zA-Z0-9]+)
NUMBER:     ([1-9]\.?[0-9]+)
この辺から急に重くなりだす。
暫くすると
メモリーガーとか言い出す。
LITERAL:    (‘[^’]*’)
WQLITERAL:  (“[^”]*”)
まで来ると、
字句解析させてみるとタイムアウト。
matchならあっという間などど思ってたら、
実は,解析結果の出力方法が・・・
for ( var idx in tokens ) {
log( idx + ” type:” + tokens[idx].type + “, token:” + tokens[idx].token );
}
だったせい。
このlog(msg)は間に合わせに作ったログの書き出し処理で
中身は・・・
function log(msg) {
$(‘#result’).text($(‘#result’).text() + msg + “\n”);
}
Form1.Designer.csを字句解析すると7000個以上のトークンに分解できるが
そこまではexecもmatchに瞬時。
しかし、DOM要素を7000回も読み書きしていたので
とても時間がかかっていたのた。 orz
ついでだから50%増速モードに変更。
var msg=””;
for (var idx = 0; idx < tokens.length; idx++) {
msg += idx + ” type:” + tokens[idx].type + “, token:” + tokens[idx].token +”\n”;
}
log(msg);
これで、劇的に早くなりデバッグも容易になった。(大笑
ま、トークンが22種類になり$1~$22となってしまうと、$9までの制限があるreplace( ) はそのままでは使えなくなるけどね。
とても、がっがりしたけど、
Form1.Designer.csの字句解析まではサクっと終わるから、
後はちゃんと文法にまとめ、HTMLのフォームに変換すれば、VisualStudioのC#のWindowsFormフォームをブラウザに写し取れるハズ。
勿論、その逆も可能なハズ。
※実はここが重要だったりする。
と云うのも、VisualStudioのフォーム・エディタで編集するとプロパティをちょっと追加しただけでテキストの順序が結構移動するので、svnの差分エディタを見るとウンザリする差分ができあがるのだ。
ここだけちょっと何とかしたい。
華麗でなくていい、綺麗にそれなりに自力でソートできるだけでも十分実用的じゃない?
でも、出来上がった正規表現パターンは訳が判らないなぁ~(爆笑
to be continue…




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA