关于一个正则表达式的问题

时间:2022-09-26 06:09:29
import java.util.regex.*;
class Regex2 {
public static void main(String[] args) {
Pattern p = Pattern.compile(args[0]);
Matcher m = p.matcher(args[1]);
boolean b = false;
while(b = m.find()) {
System.out.print(m.start() + m.group());
}
}
}
And the command line:
java Regex2 "\d*" ab34ef

输出结果为:01234456

为什么

13 个解决方案

#1


java Regex2 "\d*" ab34ef 
在你的输入参数中,"\d*" 应该是"\\d*" 

#2


其实你把
System.out.print(m.start() + m.group());
修改成
System.out.println(m.start() +"-"+m.group()+"-"); 
就好像可以看出其原因了。
修改之后的输出变成了:
0--
1--
2-34-
4--
5--
6--
我们一行一行解释吧:
\d*表示什么意思呢?表示不含或者含有不确定个数的数字。
第1个输出0,表示输入串中的第1个字符位置,没有数字,故输出位置0;
第2个输出1,表示输入串中的第2个字符位置,没有数字,故输出位置1;
第3个输出234,表示输入串中的第3个字符位置,有数字,且跟随1个数字,故输出位置2,以及两位数字34即234;
第4个输出4,表示输入串中的第5个字符位置,没数字,故输出位置4;
第5个输出5,表示输入串中的第6个字符位置,没数字,故输出位置5;
哈哈,最后一个我也不知道解释了。

按楼主的意思,好像应该将第一个输入改成"\d+"

#3


1楼,你测试了吗?就那么说?楼主的输入"\d*"中一个斜杠是正确的。除非要表示数字前还有一个斜杠,否则不应该用两个斜杠

#4


Partten.compile("\\d");  //这种情况下必须这样写,命令行下随OS而定

#5


程序里面调用Partten.compile方法直接写入正则表达式时肯定是需要用双杆的,但如果是命令行传入参数就不需要了,编译器自己会识别的。

#6


引用 2 楼 quanjinzhang 的回复:
其实你把
System.out.print(m.start() + m.group());
修改成
System.out.println(m.start() +"-"+m.group()+"-");
就好像可以看出其原因了。
修改之后的输出变成了:
0--
1--
2-34-
4--
5--
6--
我们一行一行解释吧:
\d*表示什么意思呢?表示不含或者含有不确定个数的数字。
第1个输出0,表示输入串中的第1个字符位置,没有数字,故输出位置0;
第2个输出1,表示输入串中的第2个字符位置,没有数字,故输出位置1…
第3个输出234,表示输入串中的第3个字符位置,有数字,且跟随1个数字,故输出位置2,以及两位数字34即234;
第4个输出4,表示输入串中的第5个字符位置,没数字,故输出位置4;
第5个输出5,表示输入串中的第6个字符位置,没数字,故输出位置5;
哈哈,最后一个我也不知道解释了。

*代表零个或多个,也就是要找零个或多个的那个组,并打印他的start,
find会在整个输入中寻找是否有匹配的子字符串,如果只为真,才会有start end 之类的方法
楼主的group是默认的group(0)的形式,满足外大括号条件分为一组。才会有34同时输出。
最后一个我也不知道解释了,不知道哪位高人指点一下。关注中。。

#7


最重要的是6是怎么输出的,至于“\d”没有任何问题

#8


引用 2 楼 quanjinzhang 的回复:
其实你把 
System.out.print(m.start() + m.group()); 
修改成 
System.out.println(m.start() +"-"+m.group()+"-"); 
就好像可以看出其原因了。 
修改之后的输出变成了: 
0-- 
1-- 
2-34- 
4-- 
5-- 
6-- 
我们一行一行解释吧: 
\d*表示什么意思呢?表示不含或者含有不确定个数的数字。 
第1个输出0,表示输入串中的第1个字符位置,没有数字,故输出位置0; 
第2个输出1,表示输入串中的第2个字符位置,没有数…

呵呵,又长知识了!!

#9


自己搞明白啦,这是正则表达式的无内容匹配,zero-length match  零长度匹配 

#10


该回复于2015-05-26 09:52:48被管理员删除

#11


该回复于2015-05-26 09:52:30被管理员删除

#12


empty string match!

#13


貌似没有见过matcher

#1


java Regex2 "\d*" ab34ef 
在你的输入参数中,"\d*" 应该是"\\d*" 

#2


其实你把
System.out.print(m.start() + m.group());
修改成
System.out.println(m.start() +"-"+m.group()+"-"); 
就好像可以看出其原因了。
修改之后的输出变成了:
0--
1--
2-34-
4--
5--
6--
我们一行一行解释吧:
\d*表示什么意思呢?表示不含或者含有不确定个数的数字。
第1个输出0,表示输入串中的第1个字符位置,没有数字,故输出位置0;
第2个输出1,表示输入串中的第2个字符位置,没有数字,故输出位置1;
第3个输出234,表示输入串中的第3个字符位置,有数字,且跟随1个数字,故输出位置2,以及两位数字34即234;
第4个输出4,表示输入串中的第5个字符位置,没数字,故输出位置4;
第5个输出5,表示输入串中的第6个字符位置,没数字,故输出位置5;
哈哈,最后一个我也不知道解释了。

按楼主的意思,好像应该将第一个输入改成"\d+"

#3


1楼,你测试了吗?就那么说?楼主的输入"\d*"中一个斜杠是正确的。除非要表示数字前还有一个斜杠,否则不应该用两个斜杠

#4


Partten.compile("\\d");  //这种情况下必须这样写,命令行下随OS而定

#5


程序里面调用Partten.compile方法直接写入正则表达式时肯定是需要用双杆的,但如果是命令行传入参数就不需要了,编译器自己会识别的。

#6


引用 2 楼 quanjinzhang 的回复:
其实你把
System.out.print(m.start() + m.group());
修改成
System.out.println(m.start() +"-"+m.group()+"-");
就好像可以看出其原因了。
修改之后的输出变成了:
0--
1--
2-34-
4--
5--
6--
我们一行一行解释吧:
\d*表示什么意思呢?表示不含或者含有不确定个数的数字。
第1个输出0,表示输入串中的第1个字符位置,没有数字,故输出位置0;
第2个输出1,表示输入串中的第2个字符位置,没有数字,故输出位置1…
第3个输出234,表示输入串中的第3个字符位置,有数字,且跟随1个数字,故输出位置2,以及两位数字34即234;
第4个输出4,表示输入串中的第5个字符位置,没数字,故输出位置4;
第5个输出5,表示输入串中的第6个字符位置,没数字,故输出位置5;
哈哈,最后一个我也不知道解释了。

*代表零个或多个,也就是要找零个或多个的那个组,并打印他的start,
find会在整个输入中寻找是否有匹配的子字符串,如果只为真,才会有start end 之类的方法
楼主的group是默认的group(0)的形式,满足外大括号条件分为一组。才会有34同时输出。
最后一个我也不知道解释了,不知道哪位高人指点一下。关注中。。

#7


最重要的是6是怎么输出的,至于“\d”没有任何问题

#8


引用 2 楼 quanjinzhang 的回复:
其实你把 
System.out.print(m.start() + m.group()); 
修改成 
System.out.println(m.start() +"-"+m.group()+"-"); 
就好像可以看出其原因了。 
修改之后的输出变成了: 
0-- 
1-- 
2-34- 
4-- 
5-- 
6-- 
我们一行一行解释吧: 
\d*表示什么意思呢?表示不含或者含有不确定个数的数字。 
第1个输出0,表示输入串中的第1个字符位置,没有数字,故输出位置0; 
第2个输出1,表示输入串中的第2个字符位置,没有数…

呵呵,又长知识了!!

#9


自己搞明白啦,这是正则表达式的无内容匹配,zero-length match  零长度匹配 

#10


该回复于2015-05-26 09:52:48被管理员删除

#11


该回复于2015-05-26 09:52:30被管理员删除

#12


empty string match!

#13


貌似没有见过matcher