次の文字列があります。
\018attribute1=value1\028attribute2=value2\033attribute3=value3
注:これ"\0xx"
は特殊文字を含まないハード文字列であり、"\0xx"
ランダムです。この文字列を API から取得すると、「\」文字が含まれています。
属性名と属性値を抽出したい
どうやってするの?
次の文字列があります。
\018attribute1=value1\028attribute2=value2\033attribute3=value3
注:これ"\0xx"
は特殊文字を含まないハード文字列であり、"\0xx"
ランダムです。この文字列を API から取得すると、「\」文字が含まれています。
属性名と属性値を抽出したい
どうやってするの?
\
文字を 2 回エスケープする必要があります。1 回は Java 用、もう 1 回は正規表現用です。これは に変わります\\\\
。次に、 と を使用Pattern
しMatcher
て値のマップを作成 できます。
Pattern p = Pattern.compile("\\\\0..([^=]+)=([^\\\\]*)");
Matcher matcher = p.matcher("\\018attribute1=value1\\028attribute2=value2\\033attribute3=value3");
Map<String, String> attributes = new HashMap<String, String>();
while (matcher.find()) {
attributes.put(matcher.group(1), matcher.group(2));
}
私にとってはうまくいったようなもの:
String str = "\\018attribute1=value1\\028attribute2=value2\\033attribute3=value3";
Pattern p = Pattern.compile("0\\d{2}(.*?)=(.*?)(\\\\|$)");
Matcher m = p.matcher(str);
while(m.find())
{
System.out.println(m.group(1));
System.out.println(m.group(2));
System.out.println("-------");
}
次の結果が得られました。
attribute1
value1
-------
attribute2
value2
-------
attribute3
value3
正規表現は、照合する必要があるパターンが常にバック スラッシュで始まり、その後に 2 桁の数字 (\0xx) が続くことを前提としています。次に、等号に到達するまで最初の部分文字列を抽出します。等号に一致すると、別のスラッシュに到達するか、文字列の末尾に到達するまで一致し続けます。
3 桁の数字がない場合は、\0\w{2}
この線に沿ったもので置き換えることができます。これは、ゼロの後に文字、数字、またはアンダースコアが続くものと一致します。