2015年12月27日日曜日

備忘録 Java正規表現の否定後読みでエスケープ文字をパース

プロパティ的に文字列を解析し、キーとバリューに分けるとする。

区切り文字に、空白、=、:の連続を用いるが、それらをキーに含めたい場合は\でエスケープできることにする。

というルールで1行を2つに分けるためのパターン。 ↓

String[] en = ln.split("(?<!\\\\)[\\s=:]+", 2);

これでたぶん、平気かと思われる。

キーに含まれる\はエスケープ文字なので消したいが、\自体をキーに含めたい場合は\\とすればよいことにする。

en[0].replaceAll("(?<!\\\\)\\\\", "")

こんな。


「否定の後読み」 という用語が何とも気持ち悪いが、要は、検査していった進行方向に対して後ろ(つまり文字列の手前)に対してパターンで条件指定を追加し、かつそれを「不一致なら一致」とする、ということか。・・・よけいにわからない感じだな。

テスト↓
public class Main {
public static void main(String[] args) {
_test("aa bb");
_test("aa  bb cc");
_test("aa = bb cc");
_test("aa\\ \\=bb cc");
_test("\\\\100=$1");
}
static void _test(String in){
String[] en = in.split("(?<!\\\\)[\\s=:]+", 2);
System.out.println(en[0].replaceAll("(?<!\\\\)\\\\", ""));
System.out.println("--> " + en[1]);
}
}

結果↓
aa
--> bb
aa
--> bb cc
aa
--> bb cc
aa =bb
--> cc
\100
--> $1
 たぶん出来るよね?

2015年12月19日土曜日

Windows環境でのシンボリックリンク

c:/d/fooというディレクトリを参照するリンクFOOを作成したいとき。

コマンドプロンプトを管理者権限で起動し、

> mklink FOO c:/d/foo

これで、カレントディレクトリに、c:/d/fooを参照するFOOが出来る。


管理者権限がなくてもコマンドのヘルプなどは見えるが、実行するとエラーになる(リンクを作る権限がないっぽい。どこであれ。)


自分は、Eclipse+Java+Tomcatなので、設定的に参照したいファイルをアプリ本体とは別に管理しておきつつ、稼働させているローカル環境に配置するのに使っている。(設定ファイルを本体と一緒に管理したくないけど、管理はしたいので。本体と設定ファイルを別々のプロジェクト(Git的にも)にしておいて、動かすところではリンクでつなげている)

2015年12月17日木曜日

JavaScriptで、文字列に含まれる全角の数字を半角に変換する



こんな風にすれば、


"123".replace(/[0-9]/g,function(s){return String.fromCharCode(s.charCodeAt(0) - 65248)});


123になる。


「65248」は、Unicodeの文字の並びにおける全角数字と半角数字の位置の差で、


"1".charCodeAt(0) - "1".charCodeAt(0);

このようにして求めることが出来る。


同様のやり方で、英字やひらがな→カタカナなども可能だろう。