次の種類の文字列があります。
asdf:0123-456-789:USB0::0x1234::0x9ABC::0123-456-789::INSTR
最初に、名前asdf
、シリアル0123-456-789
番号、住所文字列が続きますUSB0::0x1234::0x9ABC::0123-456-789::INSTR
。フォーマットは
name:serial:addr
名前、シリアル、住所を単一の Strings に抽出したい。アドレスも含む::
ことができるので、それだけString#split(String regex)
ではできません (または、できますか?)。私のアイデアは、これら 3 つのエンティティをキャプチャする正規表現を使用することでした。私は正規表現に非常に慣れていません。
私はJavaを使用しています:
String input = "asdf:0123-456-789:USB0::0x1234::0x9ABC::0123-456-789::INSTR";
// name
Matcher nameMatcher = Pattern.compile("[0-9a-zA-Z]+").matcher(input);
nameMatcher.find();
String name = nameMatcher.group();
// serial
Matcher serialMatcher = Pattern.compile("[0-9]{3}-[0-9]{9}-[0-9]{4}").matcher(input);
serialMatcher.find();
String serial = serialMatcher.group();
// address
Matcher addrMatcher = Pattern.compile("[0-9a-zA-Z[:]{2}-]+").matcher(input);
addrMatcher.find();
String address= addrMatcher.group();
System.out.println(name + " / " + serial + " / " + address);
// result:
// asdf, 012-012345678-0123, asdf:012-012345678-01234:USB0::0x1234::0x9ABC::012-012345678-01234::INSTR
これは、名前とシリアルには適していますが、住所には適していません (住所だけでなく、入力文字列全体をキャプチャします)。問題は、許可したいだけで許可::
したくないのです:
が、意図したとおりに機能しないことです。これを一致させる良い方法はありますか、それとも複雑すぎますか? もしそうなら、別のアプローチを教えてもらえますか?
編集:私はちょうど私にとって十分な解決策を見つけました:
String input = "asdf:012-012345678-01234:USB0::0x1234::0x9ABC::012-012345678-01234::INSTR";
String[] asdf = input.split(":");
String name = asdf[0];
String serial = asdf[1];
String address = asdf[2];
for (int i = 3; i < asdf.length; i++)
address += ":" + asdf[i];
Log.i(name + ", " + serial + ", " + address);
しかし、疑問は残ります (好奇心と何かを学ぶため)。