Java 捕获分号分隔字符串的组缺少最后一个组

Java 捕获分号分隔字符串的组缺少最后一个组,java,regex,regex-group,Java,Regex,Regex Group,我的输入字符串是 String input=" 4313 :F:7222;scott miles:F:7639;Henry Gile:G:3721"; 它是一个带分号分隔符的字符串。它可以包含由分号分隔的任意数量的值 我想在java中使用组捕获功能并捕获以下值(即:分隔) 我知道我可以在Spring类下使用split函数,但出于某种原因,我想在这里使用组捕获 我试过了 Matcher myMatcher = Pattern.compile("(.*?);").matcher(input); w

我的输入字符串是

String input=" 4313 :F:7222;scott miles:F:7639;Henry Gile:G:3721";
它是一个带分号分隔符的字符串。它可以包含由分号分隔的任意数量的值

我想在java中使用组捕获功能并捕获以下值(即:分隔)

我知道我可以在Spring类下使用split函数,但出于某种原因,我想在这里使用组捕获

我试过了

Matcher myMatcher = Pattern.compile("(.*?);").matcher(input);
while (myMatcher.find()) {
    System.out.println("group is " + myMatcher.group());
}
输出为

group is  4313 :F:7222;
group is scott miles:F:7639;
group is  4313 :F:7222
group is scott miles:F:7639
group is Henry Gile:G:3721
但预期产出是有限的

group is  4313 :F:7222
group is scott miles:F:7639
group is Henry Gile:G:3721
我不知道如何捕获最后一个分号后的最后一个值,而且我想像我在预期结果中提到的那样去掉分号。

尝试使用正则表达式:

([^;]+)
这将获得您需要的所有组


.

您正在寻找以半列结尾的组。这就是为什么你的正则表达式只计算两组而不是三组。 您可以使用这样的方法,即查找以非半列的每个符号开头的组

([^;]+)
或者,在分析输入字符串时,可以使用半列字符或行尾字符:

(.+?)(;|$)
这两种方法都给出了预期的结果

注意:对于第二组,您需要获得第一组以获得预期结果:

System.out.println("group is " + myMatcher.group(1));

尝试在
之后添加
。它也应该捕获最后一组。@SilviuBurcea不不,不要在
之后添加
。你会得到完全扭曲的匹配!如果你想知道我的意思,看看这个正则表达式演示:我从你提到的链接中得到了解释。但我认为在我的情况下([^;]*)和([^;]+)一样好,对吗?@emily是的。我通常会尝试使用“更安全”的方法,因为结果中也会出现空字符串。我认为您的意思是+将搜索除半列以外的任何字符的一个或多个出现处,而*将搜索0个或多个出现处(这就是为什么*也将包含空格)。是这样吗?请看我最后的评论对你是否有意义you@emilly哎呀,我没有收到任何关于你上次评论的通知。但是是的,这是正确的!实际上,它逐个匹配不应包含半列的每个组。如果找到了半列(在我们的例子中,它就像一个分隔符),这意味着如果在半列后面至少有一个符号,我们就得到了新的组。不,如果要使用([^;]*),输出将是六个组:组是4313:F:7222组是scott miles:F:7639组是Henry Gile:G:3721组是*是贪婪运算符,它搜索半列,当它发现我们有一个新的半列空组-这就是为什么我们有6个组。