我正在尝试使用Pattern
从字符串中取数字。
包含我的数字的字符串如下所示:
{1,3}{4,5}...{6,7}
我的输出应该是:
1 3
4 5
...
6 7
代码:
private static void products(final String products) {
final String regex = "(\\{([0-9]+),([0-9]+)\\})+";
final java.util.regex.Pattern p = java.util.regex.Pattern.compile(regex);
final Matcher matcher = p.matcher(products);
if(!matcher.matches()) {
throw new IllegalArgumentException("Wrong semantic of products!");
}
while(matcher.find()) {
System.out.print(matcher.group(1) + " ");
System.out.println(matcher.group(2));
}
}
我遇到的问题是对上述函数的调用不会打印出任何内容。我该如何解决这个问题?
答案 0 :(得分:3)
您最后需要取出+
,因为您希望一次提取一个。{/ p>
整个事情在括号中,这将是第1组,要么使其成为不匹配的组(使用?:
),要么从2开始。由于添加了{{{},删除括号将无效1}}在以下正则表达式中(参见代码)。
+
检查整个字符串,如果没有matcher.matches
,则无法使用正则表达式,您可能仍需要原始正则表达式。
此外,在同一+
上使用matches
然后find
将无效,因为Matcher
将移动字符串中的当前位置,因此,如果它匹配,它将在字符串的末尾。因此,matches
将找不到任何内容,因为没有字符串可供搜索。您可以使用find
上的reset
来重置其位置,但这显然无法解决上述问题。
更新的代码:
Matcher
对于任何感兴趣的人,这里有一种方法可以在1遍中完成:( private static void products(final String products) {
final String regex = "(?:\\{([0-9]+),([0-9]+)\\})";
// validation
final Pattern pAll = Pattern.compile(regex + "+");
if (!pAll.matcher(products).matches()) {
throw new IllegalArgumentException("Wrong semantic of products!");
}
// extraction
final Pattern p = Pattern.compile(regex);
final Matcher matcher = p.matcher(products);
while (matcher.find()) {
System.out.print(matcher.group(1) + " ");
System.out.println(matcher.group(2));
}
}
遍历整个字符串,从而导致2次遍历字符串)
matches
唯一的缺点是它会在找到无效数据之前打印出所有值。
例如,private static void products(final String products) {
final String regex = "\\{([0-9]+),([0-9]+)\\}";
final Pattern p = Pattern.compile(regex);
final Matcher matcher = p.matcher(products);
int lastEnd = 0;
while (matcher.find()) {
if (lastEnd != matcher.start())
throw new IllegalArgumentException("Wrong semantic of products!");
System.out.print(matcher.group(1) + " ");
System.out.println(matcher.group(2));
lastEnd = matcher.end();
}
if (lastEnd != products.length())
throw new IllegalArgumentException("Wrong semantic of products!");
}
将打印出来:
products("{1,3}{4,5}a{6,7}");
抛出异常之前的(因为直到字符串有效为止)。
答案 1 :(得分:2)
另一种解决方案:
private static void products2(final String products) {
final String regex = "\\{([0-9]+),([0-9]+)\\}";
if (products.split(regex).length > 0) {
throw new IllegalArgumentException("Wrong semantic of products!");
}
final Matcher matcher = Pattern.compile(regex).matcher(products);
while (matcher.find()) {
System.out.print(matcher.group(1) + " ");
System.out.println(matcher.group(2));
}
}
这个可能效率较低(String.split(...)
)但可能更优雅(将验证与处理分开)。
答案 2 :(得分:0)
另一个解决方案是将字符串拆分为“}”,然后遍历生成的数组并提取数字。每个数组元素应匹配“\\ {(\\ d +),(\\ d +)”