代码之家  ›  专栏  ›  技术社区  ›  Bug

正则表达式,用于匹配以点分隔的列表,列表末尾不带点,并允许在末尾使用星号

  •  0
  • Bug  · 技术社区  · 6 年前

    test.test = OK
    test.test.1 = OK
    test.text* = OK
    
    test.test. = NO
    test.test.* = NO
    test = NO
    

    这是我的正则表达式,它可以工作,但无法按预期成功验证输入:

    ^[a-z0-9*.\-_\.:]+$
    

    我怎样才能让它工作?

    3 回复  |  直到 6 年前
        1
  •  1
  •   Wiktor Stribiżew    6 年前

    ^(?!.*[.*]{2})[a-z0-9*_:-]+(?:\.[a-z0-9*_:-]+)+$
    

    regex demo (在regexstorm,线端为CRLF和 \r? 仅用于多行字符串演示)。

    细节

    • ^ -字符串开头
    • (?!.*[.*]{2}) . * 允许
    • [a-z0-9*_:-]+ -1个或多个ASCII小写字母、数字、, * , _ , : -
    • (?:\.[a-z0-9*_:-]+)+
      • \. -圆点
      • [a-z0-9*.-]+ * _ : -
    • $ -结束字符串。
        2
  •  1
  •   Code Maniac    6 年前

    我想这会解决你的问题。

    ^[a-z0-9]+\.[a-z0-9]+((\.[a-z0-9]+)|\*)?$
    

    ^ -字符串的开头。

    [a-z0-9] -此范围内的任何字符都将有效。

    +

    \.

    ((\.[a-z0-9]+)|\*)?

        (\.[a-z0-9]+) - this sub-group checks for . followed by any digit or characters
        \*         - matches for asterisk
        ?          - make the preceding group optional.
    

    $ -锚定在绳子的末端

        3
  •  0
  •   Pushpesh Kumar Rajwanshi    6 年前

    根据你提供的有效和无效文本样本,我得出以下结论:,

    1. 文本将包含单词字符。
    2. 单词字符可以用单点分隔。这样地 abc.xyz aaa.bbb.ccc
    3. 点字符不能是第一个或最后一个字符。这不好 .abc abc.aaa.
    4. (可选)星号字符只能作为最后一个字符出现。因此 test.text* 这很好,因为 test.text test.text.* test.text. 这不好。

    考虑到这些规则,您可以使用以下正则表达式,

    ^\w+(\.\w+)*(?<!\.)[*]?$
    

    说明:

    • ^ --&燃气轮机;字符串开头
    • \w+
    • (\.\w+)* --&燃气轮机;进一步匹配零个或多个单词字符,前面加一个文字点零次或多次。
    • (?<!\.)[*]?
    • $ --&燃气轮机;输入结束。

    Demo