Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用find()方法时,第一个实例不匹配_Java_Regex_Matcher - Fatal编程技术网

Java 使用find()方法时,第一个实例不匹配

Java 使用find()方法时,第一个实例不匹配,java,regex,matcher,Java,Regex,Matcher,我正在搜索带有正斜杠(例如/n/)之间数字的子字符串,但是find()方法总是通过正则表达式的第一个匹配项。 为什么?我的正则表达式有问题吗 Pattern p = Pattern.compile("(\\/)(\\d+)(\\/)"); Matcher m = p.matcher("A/8/E/5/F/6/G/7/H"); while (m.find()) { System.out.println(m.group(0)); } 我认为您需要这样做,因为您只需要那些斜杠之间的数字 w

我正在搜索带有正斜杠(例如/n/)之间数字的子字符串,但是find()方法总是通过正则表达式的第一个匹配项。 为什么?我的正则表达式有问题吗

Pattern p = Pattern.compile("(\\/)(\\d+)(\\/)"); 
Matcher m = p.matcher("A/8/E/5/F/6/G/7/H");
while (m.find()) {
    System.out.println(m.group(0));
}

我认为您需要这样做,因为您只需要那些
斜杠之间的
数字

while (m.find()) {
    System.out.println(m.group(2));
}
组(0)-给出整个匹配
(/n/)

组(1)-给出第一个斜杠
(/)

组(2)-为您提供编号
(n)


组(3)-为您提供第二个斜杠
(/)

如果您只想打印数字,请使用
m.group(2)

另一个解决方案是使用


Pattern p=Pattern.compile((?假设您打算使用m,您的组是“/”、“8”和“/”。尝试“\/(\d+)\/”只匹配“8”

您必须使用
group(i)
来提取括号中的第i项内容(不包括非捕获组)

group(0)
group()
是整个模式

因此,对于您的示例,您需要
组(2)

另请注意,您的代码在
8/5/4/3
上不起作用,因为
8
无法匹配,因为它前面没有
/
4
无法匹配,因为
5
在中间使用了
/
,而
3
无法匹配,因为它后面没有
//code>。您需要包括开始检查用于
8
的字符串(
^
)和用于
3
的字符串结尾(
$
),并使用前瞻
(?=…)
用于
4

我还使用了一个非捕获组
(?:…)
,因此您可以使用
组(1)
而不是
组(2)
(这是
(?:…)
的唯一区别)

另外,您不需要转义
/

最终代码:

Pattern p = Pattern.compile("(?:^|/)(\\d+)(?=/|$)");
Matcher m = p.matcher("8/5/4/3");
while (m.find()) {
    System.out.println(m.group(1));
}


m
m1
是同一个对象吗?哦,是的,我在编辑我的代码时搞砸了。
总是通过正则表达式的第一次出现是什么意思?
?我得到了响应
/8/,/5/,/6/,/7/
我最初用m1命名它,并将它编辑为m只是为了清理代码。错误仍然存在
Pattern p = Pattern.compile("(?<=\\/)(\\d+)(?=\\/)");
Matcher m = p.matcher("A/8/E/5/F/6/G/7/H");
while (m.find()) {
    System.out.println(m.group(0));
}
Pattern p = Pattern.compile("(?:^|/)(\\d+)(?=/|$)");
Matcher m = p.matcher("8/5/4/3");
while (m.find()) {
    System.out.println(m.group(1));
}