weixin_42320605 2009-07-16 17:22
浏览 228
已采纳

关于正则表达式的问题

在精通正则表达式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的意见为答案。请其余的同学勿怪。谢谢大家的回答。

  • 写回答

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]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(9条)

报告相同问题?

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料