我想从带有模式的行中获取数字,但它不会按照我的意愿对数字进行分组。
public static void main(String[] args) {
Pattern pattern = Pattern.compile("(.*?)((\\d+),{0,1}\\s*){7}");
Scanner in = new Scanner("text: 1, 2, 3, 4, 5, 6, 7"); // new Scanner(new File("data.txt"));
in.useDelimiter("\n");
try {
while(!(in.hasNext(pattern))) {
//Skip corrupted data
in.nextLine();
}
} catch(NoSuchElementException ex) {
}
String line = in.next();
Matcher m = pattern.matcher(line);
m.matches();
int groupCount = m.groupCount();
for(int i = 1; i <= groupCount; i++) {
System.out.println("group(" + i + ") = " + m.group(i));
}
}
输出:
group(1)= text:
组(2)= 7
组(3)= 7
我想得到的是:
组(2)= 1
组(3)= 2
...
组(8)= 7
我能从这种模式中得到这个吗?还是应该再制作另一种模式?
答案 0 :(得分:1)
如果您只是想收集整数,可以使用Matcher.find()
方法使用以下样式的模式迭代子字符串:1)可选分隔符或新行; 2)可能用空格包围的整数。您根本不必管理组索引,因为您只能引用具体的捕获组。以下解决方案除了正则表达式之外不需要任何其他内容,只需迭代char序列以查找整数:
package stackoverflow;
import java.util.ArrayList;
import java.util.Collection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static java.lang.System.out;
import static java.util.regex.Pattern.compile;
public final class Q11599271 {
private Q11599271() {
}
//
// (2) Let's capture an integer number only -------------------+
// (1) Let's assume it can start with a new ------+ |
// line or a comma character | |
// +-----+-----+ +-+--+
// | | | |
private static final Pattern pattern = compile("(?:^\\S+:|,)?\\s*(\\d+)\\s*");
private static Iterable<String> getOut(CharSequence s) {
final Collection<String> numbers = new ArrayList<String>();
final Matcher matcher = pattern.matcher(s);
while ( matcher.find() ) {
numbers.add(matcher.group(1));
}
return numbers;
}
private static void display(Iterable<String> strings) {
for ( final String s : strings ) {
out.print(" ");
out.print(s);
}
out.println();
}
public static void main(String[] args) {
display(getOut("text: 1, 2, 3, 4, 5, 6, 7"));
display(getOut("1, 2, 3, 4, 5, 6, 7"));
display(getOut("text: 1, 22, 333 , 4444 , 55555 , 666666, 7777777"));
}
}
这将产生以下结果:
1 2 3 4 5 6 7
1 2 3 4 5 6 7
1 22 333 4444 55555 666666 7777777
答案 1 :(得分:0)
你做不到。组始终对应于正则表达式中的捕获组。也就是说,如果您有一个捕获组,则匹配中不能有多个组。在比赛期间重复部分(甚至是捕获组)的频率是无关紧要的。表达式本身定义了最终匹配可以有多少组。