特定模式的正则表达式匹配

3

我并不是一个正则表达式的专家,所以在这里有些困难。我想创建一个匹配以下格式的模式:

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


xxx:yyy 对应的实际要求是什么?请参见 https://regex101.com/r/ffWPnZ/1 - 假设这些键/值可以包含任何字符,但不包括空格和 : - Wiktor Stribiżew
我们可以假设您的单词(catfathairless等)始终只包含字母(或者我们可以采取什么安全的假设)?另外,您想要在哪种语言/工具中实现这个功能? - Sebastian Proske
好问题 - 抱歉我应该在帖子中澄清。任何数字或字母字符,大小写不限。 - BigBug
2个回答

5
您可以使用以下正则表达式:
^[a-zA-Z0-9]+:[a-zA-Z0-9]+(?:,\s+[a-zA-Z0-9]+:[a-zA-Z0-9]+)+$

请查看正则表达式演示 细节
  • ^ - 字符串开始
  • [a-zA-Z0-9]+ - 一个或多个字母数字字符
  • : - 冒号
  • [a-zA-Z0-9]+ - 一个或多个字母数字字符
  • (?:,\s+[a-zA-Z0-9]+:[a-zA-Z0-9]+)+ - 一个或多个序列
    • , - 逗号
    • \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()默认锚定模式,因此无需使用^$

0

有一种情况没有被列为正确或不正确,但是在您的第一个正则表达式((\S):(\S))中暗示着正确:单例cat:hairy。 在这种情况下,Wiktor的出色解决方案将以*$而不是+$终止。


我没有足够的积分来评论Wiktor的解决方案,所以我只能将其作为答案提供。 - donvnielsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接