有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java正则表达式有问题吗

我有以下正则表达式:

/[-A-Z]{4}\d{2}/[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}.png

基本上我想检查基本类型的字符串

ABCD12/<here_is_a_random_uuid_as_a_string>.png
--CD12/...
AB--12/...

但不是这样:

A--D12/...

但我无法正确理解正则表达式的第一部分。基本上,我需要检查两个数字或两个-后面的数字

就我的理解而言[-A-Z]{4}的意思是“长度为4的A-Z之间的或者某个东西”。那么为什么我的模式不起作用呢

编辑: 此答案已发布在评论中,并且有效:

(?mi)^(?:--[A-Z]{2}|[A-Z]{2}(?:--|[A-Z]{2}))\d{2}/[0-9A-F]{8}(?:-[0-9A-F]{4}){3}-[0-9A-F]{12}\.png$

有人能给我解释一下(?mi)(?:...)的意思吗?正常的?表示0或1次,但是:是什么意思呢

编辑2: 仅针对那些可能有类似问题且不想读取所有这些正则表达式的人;) 我稍微修改了一个答案,也接受了类似----12的模式。最终结果是:

"^/(?:--[A-Z]{2}|-{4}|[A-Z]{2}(?:--|[A-Z]{2}))\\d{2}/[0-9A-F]{8}(?:-[0-9A-F]{4}){3}-[0-9A-F]{12}\\.png$"

它就像一个符咒


共 (2) 个答案

  1. # 1 楼答案

    您可以在您的案例中使用此正则表达式:

    ^(?: [A-Z]{2}|[A-Z]{2}(?: |[A-Z]{2}))\d{2}/[0-9A-F]{8}(?:-[0-9A-F]{4}){3}-[0-9A-F]{12}\.png$
    

    RegEx Demo

    关于第一部分的详细信息:

    • ^:开始
    • (?::启动非捕获组
      • [A-Z]{2}:匹配 后跟2个字母
      • |:或
      • [A-Z]{2}:匹配2个字母
      • (?: |[A-Z]{2}):匹配 或2个字母
    • ):结束非捕获组

    顺便说一句{}是非捕获组

  2. # 2 楼答案

    你的[-A-Z]{4}匹配任何四个出现的大写ASCII字母或-,因此它也可以匹配 A - -B-B 等等

    要确保如果有连字符,它们位于两个字母之后或之前:

    (?:[A-Z]{2} | [A-Z]{2}|[A-Z]{4})
    

    这意味着:

    • (?:-启动非捕获组:
      • [A-Z]{2} -两个大写ASCII字母,然后
      • |-或
      • [A-Z]{2}- 然后是任意两个大写ASCII字母
      • |-或
      • [A-Z]{4}-任意四个大写ASCII字母
    • )-非捕获组的结尾

    完整模式:

    (?:[A-Z]{2} | [A-Z]{2}|[A-Z]{4})\d{2}/[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}\.png
    

    要强制整个字符串匹配,请添加^(字符串开头)和$(字符串结尾)锚定:

    ^(?:[A-Z]{2} | [A-Z]{2}|[A-Z]{4})\d{2}/[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}\.png$
    

    regex demo

    注意.匹配任何字符,要匹配文字点,应该将其转义