为了账号安全,请及时绑定邮箱和手机立即绑定

这是 Java regexp 实现中的错误吗?

这是 Java regexp 实现中的错误吗?

噜噜哒 2021-12-10 09:58:39
我正在尝试将字符串iso_schematron_skeleton_for_xslt1.xsl与 regexp匹配([a-zA-Z|_])?(\w+|_|\.|-)+(@\d{4}-\d{2}-\d{2})?\.yang。预期的结果是false,它不应该匹配。问题是对matcher.matches()永远不会返回的调用。这是 Java regexp 实现中的错误吗?import java.util.regex.Matcher;import java.util.regex.Pattern;public class HelloWorld{    private static final Pattern YANG_MODULE_RE = Pattern            .compile("([a-zA-Z|_])?(\\w+|_|\\.|-)+(@\\d{4}-\\d{2}-\\d{2})?\\.yang");     public static void main(String []args){        final Matcher matcher = YANG_MODULE_RE.matcher("iso_schematron_skeleton_for_xslt1.xsl");        System.out.println(Boolean.toString( matcher.matches()));     }}我正在使用:openjdk version "1.8.0_181"OpenJDK Runtime Environment (build 1.8.0_181-b15)OpenJDK 64-Bit Server VM (build 25.181-b15, mixed mode)
查看完整描述

1 回答

?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

该模式包含嵌套的量词。的\w+是一组本身与量化内部+,这使得它很难的正则表达式引擎的过程不匹配的字符串。从交替组中创建字符类更有意义,即(\\w+|_|\\.|-)+=> [\\w.-]+

请注意,\w已经匹配_. 此外,|字符类中的 a 匹配文字|字符,并[a|b]匹配a|or b,因此您似乎应该|从第一个字符类中删除。

.compile("[a-zA-Z_]?[\\w.-]+(?:@\\d{4}-\\d{2}-\\d{2})?\\.yang")

请注意,您可以使用非捕获组 ( (?:...)) 而不是捕获组,以避免产生更多不需要的开销,因为您只是在检查匹配项而不是提取子字符串。

请参阅正则表达式演示(因为该模式用于使用matches(),因此需要完整的字符串匹配,我在正则表达式演示中添加了^$)。


查看完整回答
反对 回复 2021-12-10
  • 1 回答
  • 0 关注
  • 199 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号