在精通正则表达式40页上有这么一个例子:
作者用^[+-]?[0-9]+(.[0-9]*)?$来匹配带符号,带小数的数字。
这倒是很简单的例子,但是作者的批注我就没看懂了:
作者说(.[0-9]*)?和.?[0-9]*是截然不同的,对后一个表达式,即使.无法匹配,[0-9]*也能匹配接下来的数字。
我确实没看懂接下来匹配数字会有什么问题。
请指教,最好能给我个例子可以指出什么情况下这两个表达式匹配结果不同。
先谢。
[b]问题补充:[/b]
感谢Rowen和pan_java的回答,但我认为二位没有看清楚我得问题。关于这两个表达式的语法我是能看懂的,我看不懂的是^[+-]?[0-9]+(.[0-9]*)?$和^[+-]?[0-9]+.?[0-9]*$这个两个表达式有什么不同。请回答的时候注意:[color=red][b]最好能给我个例子可以指出什么情况下这两个表达式匹配结果不同[/b][/color]
[b]问题补充:[/b]
谢谢,pan_java,若以分组而论,这两个表达式确实不同,不过作者在这里完全没有提及分组,我敲一段原文,给大家看看:
作者在上一段讲了一个例子说用^[0-9]+$来匹配一个数字,
下面是这段的原文:
让我们扩展这个例子,允许输入负数和可能出现的小数部分。我们添加一个-?来容许最前面的负数符号。实际上,我们可以用[-+]来处理开头的正负号。
要容许可能出现的小数部分,我们添加(.[0-9]*)?。转义的点号匹配小数点,所以.[0-9]*用来匹配小数点和后面可能出现的数字。因为.[0-9]*被()?所包围,整个子表达式都不是匹配成果必须的([color=red]请注意,它与.?[0-9]*是截然不同的,对后一个表达式中,即使.无法匹配,[0-9]也能匹配接下来的数字[/color])。就是上边标红的这句话让我费解。
从作者行文看,这里是一个很简单的例子,应该不会说分组的东西。除了分组还有什么不同呢?
[b]问题补充:[/b]
pan_java, rowen:
看了二位最后的回复,我想可能是我把作者的意思搞错了。
我确认一下,二位觉得是不是作者在说.[0-9]*和(.[0-9]*)?这两个表达式的结果不同,[color=red]而不是说整个表达式即:^[+-]?[0-9]+(.[0-9]*)?$和^[+-]?[0-9]+.?[0-9]*$不同[/color]。如果这样的话,那我完全同意。
我其实疑惑的是^[+-]?[0-9]+(.[0-9]*)?$和^[+-]?[0-9]+.?[0-9]*$这两个表达式的匹配结果除了分组以外,有没有不同,二位觉得呢?
[b]问题补充:[/b]
ok,那么做结论。看来我提了一个比较傻的问题。鉴于pan_java指出有关于分组的不同,采纳pan_java的意见为答案。请其余的同学勿怪。谢谢大家的回答。
关于正则表达式的问题
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
10条回答 默认 最新
- fdsafds 2009-07-16 18:08关注
[code="java"]import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class Test {
/** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String regexp1 = "^[+-]?[0-9]+(\\.[0-9]*)?$"; String regexp2 = "^[+-]?[0-9]+\\.?[0-9]*$"; Pattern pattern1 = Pattern.compile(regexp1); Pattern pattern2 = Pattern.compile(regexp2); String str = "0.36"; Matcher m1 = null; Matcher m2 = null; m1 = pattern1.matcher(str); m2 = pattern2.matcher(str); //regexp1 对比 regexp2 主要是有一个分组的功能 if(m1.find()){ System.out.println(m1.group(0));//0.36 System.out.println(m1.group(1));//.36 } if(m2.find()){ System.out.println(m2.group(0));//0.36 //System.out.println(m2.group(1));//null } }
}[/code]
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 乌班图ip地址配置及远程SSH
- ¥15 怎么让点阵屏显示静态爱心,用keiluVision5写出让点阵屏显示静态爱心的代码,越快越好
- ¥15 PSPICE制作一个加法器
- ¥15 javaweb项目无法正常跳转
- ¥15 VMBox虚拟机无法访问
- ¥15 skd显示找不到头文件
- ¥15 机器视觉中图片中长度与真实长度的关系
- ¥15 fastreport table 怎么只让每页的最下面和最顶部有横线
- ¥15 java 的protected权限 ,问题在注释里
- ¥15 这个是哪里有问题啊?