正则表达式中 ?=.*? 的疑惑

请教一个正则表达式的问题, 如下代码所示, 我是用的java使用正则表达式;

    public static void test(){
        Pattern p=Pattern.compile("(?=.*?[#?!@$%^&*-])");
        Matcher m=p.matcher("我的QQ是:456456 我的电话是:0532214 我的邮箱是:aaa123@aaa.com");
        while(m.find()) {
            System.out.println(m.group());
        }
        System.out.print("我已经执行过了");
        
    }

问题1: 上面的代码为什么不能匹配@,没打印出@
我的尝试: 改为 Pattern p=Pattern.compile("[#?!@$%^&*-])");,就可以正常匹配了.

问题2: 请问?=.*?的含义是什么, 我理解的含义是"任何字符开头的"

问题3: 请问这个正则表达式 能包含所有特殊字符吗, 我现在的需求是检查中字符中的特殊字符

阅读 3.4k
2 个回答

(?=)只是匹配一个位置

使用圆括号时会把匹配的内容缓存,加上?=就不会被缓存,平时不太能用上,这个叫非捕获元字符,.*?这个就是0个或多个任意字符啦;

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题