【问题标题】:Regex match on specific pattern特定模式的正则表达式匹配
【发布时间】:2017-06-26 12:47:37
【问题描述】:

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

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 对的实际要求是什么?请参阅regex101.com/r/ffWPnZ/1 - 这是假设这些键/值可以包含除空格和: 之外的任何字符。
  • 我们可以假设您的话(catfathairless 等)总是只有字母(或者我们可以采取任何安全的假设)吗?您还想用哪种语言/工具来实现它?
  • 好问题 - 对不起,我应该在帖子中澄清。任何数字或字母字符,大写或小写。

标签: regex


【解决方案1】:

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

^[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 个或多个字母数字字符
  • $ - 字符串结束

根据正则表达式的风格和用途,[a-zA-Z0-9] 可以替换为[[:alnum:]](POSIX、Ruby、PCRE)或\p{Alnum}(Java)。所以,在 Java 中,你会使用

.matches("\\p{Alnum}+:\\p{Alnum}+(?:,\\s+\\p{Alnum}+:\\p{Alnum}+)+")

注意不需要^$,因为.matches() 默认锚定模式。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我不被允许评论 Wiktor 的解决方案,因为我没有要点。所以我不得不提供它作为答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    相关资源
    最近更新 更多