Java “正则表达式检测”;不止一个“;整体的

Java “正则表达式检测”;不止一个“;整体的,java,regex,Java,Regex,我有以下类型的字符串: 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 regex)它(或者我可以?)。我的想法是使用一个正

我有以下类型的字符串:

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 regex)
它(或者我可以?)。我的想法是使用一个正则表达式来捕获这三个实体。我对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);
String input=“asdf:012-012345678-01234:USB0::0x1234::0x9ABC::012-012345678-01234::INSTR”;
字符串[]asdf=input.split(“:”);
字符串名称=asdf[0];
字符串序列=asdf[1];
字符串地址=asdf[2];
for(int i=3;i
但问题依然存在(出于好奇和学习)

输出

name = asdf
serial = 0123-456-789
addr = USB0::0x1234::0x9ABC::0123-456-789::INSTR
输出

name = asdf
serial = 0123-456-789
addr = USB0::0x1234::0x9ABC::0123-456-789::INSTR

你可以这样做

input.split("(?<!:):(?!:)")

input.split((?您可以执行以下操作

input.split("(?<!:):(?!:)")

input.split(“(?您可以自己将地址与regex
([\w-])+(:([\w-])+)+


您可以自己将地址与正则表达式匹配
([\w-])+(::([\w-])+


@Nishant这适用于名称和序列号,但不适用于地址,我必须用这种方法拼图(见我的编辑)。@Nishant这适用于名称和序列号,但不适用于地址,我必须用这种方法拼图(见我的编辑)。酷,这就是我一开始想要的。谢谢你的详细解释。酷,这就是我一开始想要的。谢谢你的详细解释。效果很好。虽然我真的不明白为什么。我不理解
?和
?!
之前的
。他们都是回头看s、 结构类似于
(?工作得很好。虽然我真的不明白为什么。我不理解
?和
?!
前面的
。它们看起来像头和落后。结构类似于
)我接受这个答案,因为它是我现在使用的答案。然而,其他答案对我也很有帮助。我接受这个答案,因为它是我现在使用的答案。然而,其他答案对我也很有帮助。