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})
这意味着:
-启动非捕获组:(?:
-两个大写ASCII字母,然后[A-Z]{2}--
--
-或|
--[A-Z]{2}
然后是任意两个大写ASCII字母-
-或|
-任意四个大写ASCII字母[A-Z]{4}
-非捕获组结束)
(?:[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个字母--
:或|
:匹配2个字母[A-Z]{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$