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$"
它就像一个符咒
# 1 楼答案
您可以在您的案例中使用此正则表达式:
RegEx Demo
关于第一部分的详细信息:
^
:开始(?:
:启动非捕获组[A-Z]{2}
:匹配|
:或[A-Z]{2}
:匹配2个字母(?: |[A-Z]{2})
:匹配)
:结束非捕获组顺便说一句{}是非捕获组
# 2 楼答案
你的
、
[-A-Z]{4}
匹配任何四个出现的大写ASCII字母或-
,因此它也可以匹配A -
、-B
、-B
等等要确保如果有连字符,它们位于两个字母之后或之前:
这意味着:
(?:
-启动非捕获组:[A-Z]{2}
-两个大写ASCII字母,然后|
-或[A-Z]{2}
-|
-或[A-Z]{4}
-任意四个大写ASCII字母)
-非捕获组的结尾李>完整模式:
要强制整个字符串匹配,请添加
^
(字符串开头)和$
(字符串结尾)锚定:见regex demo
注意
.
匹配任何字符,要匹配文字点,应该将其转义