我正在尝试将字符串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(),因此需要完整的字符串匹配,我在正则表达式演示中添加了^和$)。
添加回答
举报
0/150
提交
取消
