【问题标题】:how to match a list of fixed length words separated by space or comma?如何匹配以空格或逗号分隔的固定长度单词列表?
【发布时间】:2019-08-22 17:19:00
【问题描述】:

单词的长度可以是 2 或 6-10,可以用空格或逗号分隔。该单词仅包括字母,不区分大小写。

这里是应该匹配的词组:

RE,re,rereRE

不匹配组:

RE,rere,rel
RE,RERE

这是我尝试过的模式

((([a-zA-Z]{2})|([a-zA-Z]{6,10}))(,|\s+)?)

但不幸的是,这种模式可以匹配这样的字符串:RE,RERE 好像还没有设置单词边界。

【问题讨论】:

    标签: regex


    【解决方案1】:

    您可以使用 alternation 匹配 chars a-z 2 或 6 - 10 次

    然后重复该模式 0+ 次,前面加上逗号或空格 [ ,]

    ^(?:[A-Za-z]{6,10}|[A-Za-z]{2})(?:[, ](?:[A-Za-z]{6,10}|[A-Za-z]{2}))*$
    

    说明

    • ^ 字符串开始
    • (?:[A-Za-z]{6,10}|[A-Za-z]{2}) 匹配字符 a-z 6 -10 或 2 次​​li>
    • (?:非捕获组
    • [, ](?:[A-Za-z]{6,10}|[A-Za-z]{2}) 匹配逗号或空格并重复上一个模式
    • )*关闭非捕获组并重复0+次
    • $字符串结束

    Regex demo

    如果支持环视,您还可以断言直接在左侧和右侧的不是非空白字符\S

    (?<!\S)(?:[A-Za-z]{6,10}|[A-Za-z]{2})(?:[ ,](?:[A-Za-z]{6,10}|[A-Za-z]{2}))*(?!\S)
    

    Regex demo

    【讨论】:

    • 您好,非常感谢。我刚试过,你的模式很有效。
    【解决方案2】:
    ([a-zA-Z]{2}(,|\s)|[a-zA-Z]{6,10}|(,|\s))
    

    【讨论】:

      【解决方案3】:

      这一项只会得到有 2 个字母或 6 到 10 个字母的单词

      \b,?([a-zA-Z]{6,10}|[a-zA-Z]{2}),?\b
      

      【讨论】:

        【解决方案4】:

        你可以用这个

        ^(?!.*\b[a-z]{4}\b)(?:(?:[a-z]{2}|[a-z]{6,10})(?:,|[ ]+)?)+$
        

        Regex Demo

        【讨论】:

          【解决方案5】:

          此正则表达式将匹配您的第一个案例,但您的其他两个案例都不匹配:

          ^((([a-zA-Z]{2})|([a-zA-Z]{6,10}))(,|[ ]+|$))+$

          我在这里假设每一行都应该是一个匹配项。

          Here 正在行动中。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-03-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多