java - 正则表达式检测实体的 "more than one"

标签 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#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);

但问题仍然存在(出于好奇和学习一些东西)。

最佳答案

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

关于java - 正则表达式检测实体的 "more than one",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11413602/

相关文章:

java - 限制接受的 HTTP 响应大小

java - 排序列表 - 如何?

java - 修改作为托管属性从另一个托管 Bean 访问的托管 Bean 的私有(private)对象属性

regex - 具有给定字母表的正则表达式语言的语法

javascript - 用返回函数替换PHP中的字符串

Java Swing : prevent Components to update enabled state until I tell them to

java - 需要在eclipse中调试一个swing应用程序

regex - 如何在 MATLAB 中使用 REGEXP 选择字符串的一部分或另一部分

php - 需要更快的 PHP/MySQL 搜索算法来进行高度复杂的计算

用于从输入字符串生成正则表达式的 Java 库