2017-06-26 94 views
2

绝对不是正则表达式的专家,所以我在这里挣扎了一下。我想创建一个模式,将匹配的格式如下:在特定模式下的正则表达式匹配

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

'xxx:yyy'对的实际要求是什么?请参阅https://regex101.com/r/ffWPnZ/1 - 这是假定这些键/值可以包含任何字符,但空格和“:”。 –

+0

我们可以假设你的话('猫','胖','无毛'等)总是只有字母(或者是否有任何安全的假设)?您还想要在哪种语言/工具中实现? –

+0

好问题 - 抱歉,我应该在帖子中澄清。任何数字或字母字符,大写或小写。 – BigBug

回答

5

您可以使用下面的正则表达式:

^[a-zA-Z0-9]+:[a-zA-Z0-9]+(?:,\s+[a-zA-Z0-9]+:[a-zA-Z0-9]+)+$ 

参见regex demo

详细

  • ^ - 串的开始
  • [a-zA-Z0-9]+ - 1以上的字母数字字符
  • : - 冒号
  • [a-zA-Z0-9]+ - 1以上的字母数字字符
  • (?:,\s+[a-zA-Z0-9]+:[a-zA-Z0-9]+)+ - 1或更序列号
    • , - 逗号
    • \s+ - 1以上空格
    • [a-zA-Z0-9]+ - 1以上的字母数字字符
    • : - 冒号
    • [a-zA-Z0-9]+ - 1以上的字母数字字符
  • $ - 的端字符串

D根据正则表达式的风格和目的,[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的优秀解决方案将终止于*$而不是+$

+0

我没有被允许评论Wiktor的解决方案,因为我没有要点。所以我不得不提供它作为答案。 – donvnielsen