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
 たぶん出来るよね?

0 件のコメント:

コメントを投稿