Java 用于验证自定义格式的正则表达式
我有以下格式:Java 用于验证自定义格式的正则表达式,java,regex,Java,Regex,我有以下格式:xx:xx:xx或xx:xx:xx-y,其中x可以是0-9 a-f a-f,y只能是0或1 我提出了这个正则表达式:([0-9A-Fa-f]{2}[:][0-9A-Fa-f]{2}[:][0-9A-Fa-f]{2}|[-][0-1]{1}) (见附件) 但这也与0a:0b:0c-3匹配,这是不期望的 有没有办法从结果中删除这些大小写?[:]表示列表中只包含:的字符。这和 :。与[-]相同,其结果与-相同 另外,{1}的意思是“前一件作品正好一次”。它没有任何效果,您可以完全删除它
xx:xx:xx
或xx:xx:xx-y
,其中x可以是0-9 a-f a-f,y只能是0或1
我提出了这个正则表达式:([0-9A-Fa-f]{2}[:][0-9A-Fa-f]{2}[:][0-9A-Fa-f]{2}|[-][0-1]{1})
(见附件)
但这也与0a:0b:0c-3
匹配,这是不期望的
有没有办法从结果中删除这些大小写?
[:]
表示列表中只包含:
的字符。这和
:
。与[-]
相同,其结果与-
相同另外,
{1}
的意思是“前一件作品正好一次”。它没有任何效果,您可以完全删除它
要匹配xx:xx:xx
或xx:xx:xx-y
,匹配-y
的零件必须是可选的。可选零件后的量词?
将其标记为可选
总之,您的regex
应该是这样的:
[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}(-[01])?
如果可以告诉您使用的regex
引擎忽略字符大小写,则您可以从所有字符类中删除A-F
(或A-F
),并且regex
变为:
[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}(-[01])?
工作原理,一件一件:
[0-9a-f] # any digit or letter from (and including) 'a' to 'f'
{2} # the previous piece exactly 2 times
: # the character ':'
[0-9a-f]
{2}
:
[0-9a-f]
{2}
( # start a group; it does not match anything
- # the character '-'
[01] # any character from the class (i.e. '0' or '1')
) # end of group; the group is needed for the next quantifier
? # the previous piece (i.e. the group) is optional
# it can appear zero or one times
在行动中看到它:
更新
正如@third bird在评论中提到的,如果regex
必须匹配整个字符串,那么您需要锚定其末端:
^[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}(-[01])?$
^
作为正则表达式的第一个字符与字符串开头匹配,$
作为最后一个字符与字符串结尾匹配。这样,regex
只匹配整个字符串(当xx:xx:xx
或xx:xx:xx-y
部分前后没有其他字符时)
如果使用regex
查找较大字符串中的xx:xx:xx
或xx:xx:xx-y
,则无需添加^
和$
。当然,您可以只添加^
或$
,使正则表达式只在字符串的开头或结尾匹配。您需要
xx:xx:xx
或者如果它后面跟一个-
,那么它必须是0
或1
,然后它就是结尾(单词边界)
所以你不想要这些
0a:0b:0c-123
0a:0b:0cd
10a:0b:0c
要么
然后您需要“负面外观”,因此如果您匹配第一部分,您不希望它后面跟着一个-
(第一个模式),它应该在那里结束(单词边界),如果它后面跟着一个-
,那么它必须是0
或1
,然后是单词边界:
/\b([0-9a-f]{2}[:][0-9a-f]{2}[:][0-9a-f]{2}(?!-)\b|\b[0-9a-f]{2}[:][0-9a-f]{2}[:][0-9a-f]{2}-[01]\b)/i
为了防止前面出现任何数字,在前面还添加了一个单词边界
例如:
以下几点几乎奏效:
/\b([0-9a-f]{2}[:][0-9a-f]{2}[:][0-9a-f]{2}\b[^-]|\b[0-9a-f]{2}[:][0-9a-f]{2}[:][0-9a-f]{2}-[01]\b)/i
但是如果它是文件的结尾,并且是3a:2b:11
,那么[^-]
将尝试匹配非-
字符,但它不会匹配
示例:将[0-1]
更改为[01]
[:]
表示列表中仅包含:
的字符。它与:
相同。与[-]
相同,其结果与-
相同。来自:“由于正则表达式未完全标准化,因此带有此标记的所有问题还应包括指定适用编程语言或工具的标记。”不确定OP想要什么,但如果字符串根本不匹配,而不是部分匹配,您还可以添加锚定^$
+1@axiac详细的解释令人赞叹,但建议的正则表达式仍然匹配意外的字符串。nopole的建议在我的案例中起作用Brilliant@nopole我缺少的是负面形象,我认为,它非常有效