java正则表达式有问题吗

java正则表达式有问题吗,java,regex,Java,Regex,我有以下正则表达式: /[-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 但不是这样: A--D12/... 但我无法正确理解正则表达式的第一部分。基本上,我需要检查两个数字或两个-后面的数字 就我的理解而言,[-A-Z]{4}的意思是“要么-要

我有以下正则表达式:

/[-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
但不是这样:

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

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

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

(?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$"

它就像一个符咒。

你的
[-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]{2}))\d{2}/[0-9A-F]{8}(?:-[0-9A-F]{4}){3}-[0-9A-F]{12}\.png$

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

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

顺便说一句,
(?:…)
是非捕获组。

请检查我在开始时添加了
(?![^/])*(?或者我用
(?:[A-Z]{2}--[A-Z]{2})替换了
(?:[A-Z]{2})
您的正则表达式不适合有效的UUID,如“3d56bada-0373-4cf8 bd61-eeca1a606bc7”您是否要求如果出现连字符,第一个和第二个字符必须是连字符,或者第三个和第四个字符必须是连字符?如果不使用任何lookaahead/lookbehind,它可以是这样的:
(?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$
@jrook谢谢,我有一个uuid的大写字符串。在description@F_Schmidt您的模式与
A--B12/ABCD1234-abc-1234-1234-abc1234abc123.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$
^(?:--[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$