Java正则表达式最长匹配
我对匹配(某种程度上)表单的典型字符串的泛型正则表达式有问题Java正则表达式最长匹配,java,regex,Java,Regex,我对匹配(某种程度上)表单的典型字符串的泛型正则表达式有问题 ... "field1" "field2" "field3" "field4" ... ... \"(.*?)\" +\"(.*?)\" +\"(.*?)\" +\"(.*?)\" + ... 当然,我想做的是分别获取这些字段。因为字段可以包含任何字符,所以我使用的是表单的“catch all”正则表达式 ... "field1" "field2" "field3" "field4" ... ... \"(.*?)\" +\"(
... "field1" "field2" "field3" "field4" ...
... \"(.*?)\" +\"(.*?)\" +\"(.*?)\" +\"(.*?)\" + ...
当然,我想做的是分别获取这些字段。因为字段可以包含任何字符,所以我使用的是表单的“catch all”正则表达式
... "field1" "field2" "field3" "field4" ...
... \"(.*?)\" +\"(.*?)\" +\"(.*?)\" +\"(.*?)\" + ...
问题是,Java没有生成4个不同的组,而是只提供了一个组,它合并了上述4个组,即我得到一个字段:
field1" "field2" "field3" "field4
而不是
field1
field2
field3
field4
我甚至尝试过对每个字段执行\“([^\“]*)\”之类的操作,但结果是一样的
如何分别获取这4个字段?是否调用matcher.group(1)、matcher.group(2)等来获取单个匹配项?默认方法返回所有字段的整个匹配项。是否调用matcher.group(1)、matcher.group(2),等来获取单个匹配项?默认方法返回整个匹配项,即所有字段。每次调用
matcher.find()
都将移动到下一个匹配项:
String input = "... \"field1\" \"field2\" \"field3\" \"field4\" ...";
Matcher matcher = Pattern.compile("\"(.*?)\"").matcher(input);
while (matcher.find())
System.out.println(matcher.group(1));
或者,如果您真的想在一场比赛中捕获所有四个:
Matcher matcher = Pattern.compile("\"(.*?)\".*?\"(.*?)\".*?\"(.*?)\".*?\"(.*?)\".*?").matcher(input);
if (matcher.find()) {
System.out.println(matcher.group(1));
System.out.println(matcher.group(2));
System.out.println(matcher.group(3));
System.out.println(matcher.group(4));
}
两者产生相同的输出,即:
field1
field2
field3
field4
每次调用
matcher.find()
都将移动到下一个匹配:
String input = "... \"field1\" \"field2\" \"field3\" \"field4\" ...";
Matcher matcher = Pattern.compile("\"(.*?)\"").matcher(input);
while (matcher.find())
System.out.println(matcher.group(1));
或者,如果您真的想在一场比赛中捕获所有四个:
Matcher matcher = Pattern.compile("\"(.*?)\".*?\"(.*?)\".*?\"(.*?)\".*?\"(.*?)\".*?").matcher(input);
if (matcher.find()) {
System.out.println(matcher.group(1));
System.out.println(matcher.group(2));
System.out.println(matcher.group(3));
System.out.println(matcher.group(4));
}
两者产生相同的输出,即:
field1
field2
field3
field4
对于此类输入,您可以尝试
String.split
方法
String input = "... \"field1\" \"field2\" \"field3\" \"field4\" ...";
String[] split = input.split("\"\\s*\"?");
String field1 = split[1]; // field1
String field2 = split[2]; // field2
String field3 = split[3]; // field3
String field4 = split[4]; // field4
对于此类输入,您可以尝试
String.split
方法
String input = "... \"field1\" \"field2\" \"field3\" \"field4\" ...";
String[] split = input.split("\"\\s*\"?");
String field1 = split[1]; // field1
String field2 = split[2]; // field2
String field3 = split[3]; // field3
String field4 = split[4]; // field4
拆分[x]--索引以0开头。@Nrj:索引0可能有空字符串或前缀“field1”字符串。请尝试验证。拆分[x]--索引以0开头。@Nrj:索引0可能有空字符串或前缀“field1”字符串。请尝试验证。