绝对不是Regex的专家,所以我在这里苦苦挣扎。我想创建一个符合以下格式的模式:
cat:hairy, rat:hairless [correct]
cat:hairy, rat:hairless, dog:fat [correct]
cat:hairy, rat:hairless [correct]
cat [incorrect]
cat, dog [incorrect]
cat:hairy, [incorrect]
cat:hairy, monkey, dog:fat [incorrect]
cat:hairy rat:hairless, dog:fat [incorrect]
到目前为止,我的正则表达式如下:
((\S):(\S))
但是,这并不适用于所有情况。任何帮助将不胜感激!
更新 语言:Java 格式:xxx:yyy可以是任何字母或数字,大写或小写
答案 0 :(得分:5)
您可以使用以下正则表达式:
^[a-zA-Z0-9]+:[a-zA-Z0-9]+(?:,\s+[a-zA-Z0-9]+:[a-zA-Z0-9]+)+$
请参阅regex demo
<强>详情:
^
- 字符串开头[a-zA-Z0-9]+
- 一个或多个字母数字字符:
- 冒号[a-zA-Z0-9]+
- 一个或多个字母数字字符(?:,\s+[a-zA-Z0-9]+:[a-zA-Z0-9]+)+
- 1个或多个序列
,
- 逗号\s+
- 一个或多个空格[a-zA-Z0-9]+
- 一个或多个字母数字字符:
- 冒号[a-zA-Z0-9]+
- 一个或多个字母数字字符$
- 字符串结尾根据正则表达式的风格和目的,[a-zA-Z0-9]
可以替换为[[:alnum:]]
(POSIX,Ruby,PCRE)或\p{Alnum}
(Java)。因此,在Java中,您可以使用
.matches("\\p{Alnum}+:\\p{Alnum}+(?:,\\s+\\p{Alnum}+:\\p{Alnum}+)+")
请注意,默认情况下,^
和$
不需要.matches()
锚定模式。
答案 1 :(得分:0)
有一种情况未被列为正确或不正确,但您的第一个正则表达式((\S):(\S))
暗示正确:单身cat:hairy
。在这种情况下,
那么Wiktor的优秀解决方案将以*$
而不是+$
终止。