【问题标题】:Need help constructing a regex需要帮助构建正则表达式
【发布时间】:2011-07-20 08:13:18
【问题描述】:

我需要编写一个正则表达式来匹配表示逗号分隔的星期几的字符串,例如:

"Sun,Mon,Tue,Wed,Thu,Fri,Sat"

每天在字符串中最多出现一次。天的顺序很重要。

到目前为止,我已经尝试了以下模式:

1)(Sun,|Mon,|Tue,|Wed,|Thu,|Fri,|Sat,)*(Sun|Mon|Tue|Wed|Thu|Fri|Sat)

这个很糟糕:允许多个天数存在,也不监视天数顺序。

2)(Sun)?([,^]Mon)?([,^]Tue)?([,^]Wed)?([,^]Thu)?([,^]Fri)?([,^]Sat)?

这是迄今为止我得到的最好的。这里唯一的问题是它匹配以逗号开头的字符串,例如,Mon,Tue,Fri。我的问题是如何过滤掉匹配此模式的逗号起始字符串。

提前致谢。

【问题讨论】:

    标签: regex string regex-negation


    【解决方案1】:

    同意正则表达式可能不是最佳选择。但是,如果您当前版本的唯一问题是它匹配以逗号开头的字符串,则您可以在正则表达式的开头检查是否有起始逗号:

    (?!,)(Sun)?([,^]Mon)?([,^]Tue)?([,^]Wed)?([,^]Thu)?([,^]Fri)?([,^]Sat)?
    

    但是,我认为 [,^] 不会像您认为的那样 - 在我熟悉的正则表达式风格中,方括号内的 ^ 与文字 ^ 匹配时,它不是第一个字符list - 它与字符串的开头不匹配。你可以用(^|,)替换它:

    (?!,)(Sun)?((^|,)Mon)?((^|,)Tue)?((^|,)Wed)?((^|,)Thu)?((^|,)Fri)?((^|,)Sat)?
    

    【讨论】:

    • 谢谢,不知道方括号中的^)
    【解决方案2】:

    这有点复杂,但它满足您的所有规范。也许正则表达式不是最好的解决方案......

    ^(Sun(,(?=.)|$))?(Mon(,(?=.)|$))?(Tue(,(?=.)|$))?(Wed(,(?=.)|$))?(Thu(,(?=.)|$))?(Fri(,(?=.)|$))?(Sat)?$
    

    作为一个冗长的正则表达式:

    ^         # start of string
    (         # Try to match...
     Sun      # Sun
     (        # followed by either
      ,       # a comma
      (?=.)   # but only if more text follows
     |        # or
      $       # end of string
     )
    )?        # make it optional.
    (Mon(,(?=.)|$))?    # same for Mon-Fri
    (Tue(,(?=.)|$))?
    (Wed(,(?=.)|$))?
    (Thu(,(?=.)|$))?
    (Fri(,(?=.)|$))?
    (Sat)?    # never a comma after Sat
    $         # end of string
    

    【讨论】:

      【解决方案3】:

      另一种选择是创造性地使用word boundaries:

      ^\b(?:Sun)?,?\b(?:Mon)?,?\b(?:Tue)?,?\b(?:Wed)?,?\b(?:Thu)?,?\b(?:Fri)?,?\b(?:Sat)?$
      

      或者,如果您不关心每天捕捉,您可以进一步简化:

      ^\b(Sun)?,?\b(Mon)?,?\b(Tue)?,?\b(Wed)?,?\b(Thu)?,?\b(Fri)?,?\b(Sat)?$
      

      \b 只匹配单词字符和非单词字符。在这种情况下,介于一天和逗号或字符串的边缘(开始或结束)之间。
      单词边界确保每个逗号都被字母包围:它永远不会匹配字符串边缘附近的逗号。同样,如果逗号不存在,则在两天之间永远不会匹配,如SunMon。

      示例:http://rubular.com/r/mTCU0ZWtMm

      【讨论】:

      • 我从^(?:Sun)?\b,?\b(?:Mon)?\b,?\b(?:Tue)?\b,?\b(?:Wed)?\b,?\b(?:Thu)?\b,?\b(?:Fri)?\b,?\b(?:Sat)?$开始,但我认为简化版应该也可以:P
      猜你喜欢
      • 1970-01-01
      • 2023-03-17
      • 2012-11-30
      • 2023-03-19
      • 1970-01-01
      • 2021-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多