【问题标题】:Regex spaces restriction not matching正则表达式空格限制不匹配
【发布时间】:2018-01-30 19:00:15
【问题描述】:

我有以下正则表达式:^([^\s][a-zA-Z_\-]+\s)*([^\s][a-zA-Z_\-]+$)

执行以下操作:

  • 开头没有空格

  • 结尾没有空格

  • 中间没有双空格

但它与这些字符串不匹配:

abd d

a bdc

确实符合这些:

abd de

ab cde

所以我认为它在提到的点之外做了其他事情,我需要它与 abd d 类型的示例相匹配。

它应该并且确实允许在两者之间有一个空格,但只有当单个空格左右的字符串长度为 2 或更多时才能看到。

我错过了什么?

【问题讨论】:

    标签: regex spaces


    【解决方案1】:

    问题在于[^\s] 在需要非空白字符的模式中,它需要在字符串开始/结束和字符串内的非空白块之间至少有 2 个字符。如果你删除它们,your pattern will work

    但是,我建议在 - 之前删除不必要的 \(在字符类的末尾,不需要转义 -)并量化 last 部分,更接近到最后,这样,它需要更少的回溯:

    ^[a-zA-Z_-]+(?:\s[a-zA-Z_-]+)*$
    

    请参阅regex demo

    详情

    • ^ - 字符串开头
    • [a-zA-Z_-]+ - 1 个或多个 ASCII 字母,_-
    • (?:\s[a-zA-Z_-]+)* - 0+ 次出现:
      • \s - 一个空格字符
      • [a-zA-Z_-]+ - 1 个或多个 ASCII 字母,_-
    • $ - 字符串结束。

    【讨论】:

    • 完美。非常感谢。
    【解决方案2】:

    这是我的首选方式。
    绝不容易出现回溯问题。

    如果您有很多由空格分隔的单个字母,这是更快的方法。

    ^[a-zA-Z_-](?:\s?[a-zA-Z_-])*$

    https://regex101.com/r/dRpDYE/1

    格式化

     ^                     # BOS
     [a-zA-Z_-]            # Single a-z, etc..
     (?:                   # Cluster 
          \s?                   # Optional space, the only place a space can match
          [a-zA-Z_-]            # Must be followed by single a-z, etc..
     )*                    # End cluster, do 0 to many times 
     $                     # EOS
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-26
      • 2018-02-16
      • 2010-10-08
      相关资源
      最近更新 更多