我有以下类型的字符串:
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
我想将名称,序列和地址提取为单个字符串。该地址还可以包含::
,因此我不能String#split(String regex)
它(或者我可以吗?)。我的想法是使用捕获这三个实体的正则表达式。我是正则表达式的新手。
我正在使用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);
但问题仍然存在(出于好奇和学习的目的)。
答案 0 :(得分:2)
String info="asdf:0123-456-789:USB0::0x1234::0x9ABC::0123-456-789::INSTR";
String[] array=info.split(":", 3);//split only in 3 parts
System.out.println("name="+array[0]);
System.out.println("serial="+array[1]);
System.out.println("addr="+array[2]);
输出
name = asdf
serial = 0123-456-789
addr = USB0::0x1234::0x9ABC::0123-456-789::INSTR
答案 1 :(得分:2)
您可以执行类似
的操作input.split("(?<!:):(?!:)")
基本上围绕:字符,以确保其旁边没有其他字符。
答案 2 :(得分:1)
您可以将地址与正则表达式([\w-])+(::([\w-]+))+
([\w-])+ one or more word (alphanumeric) or hyphen characters ...
( ... followed by ...
:: ... two colons ...
([\w-]+) ... with one or more word (alphanumeric) or hyphen characters ...
)+ ... at least one more time