正则表达式匹配特定模式

时间:2017-06-26 12:47:38

标签: regex

绝对不是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可以是任何字母或数字,大写或小写

2 个答案:

答案 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的优秀解决方案将以*$而不是+$终止。