Regex 需要帮助构造正则表达式吗
我需要编写一个正则表达式,它匹配表示一周中以逗号分隔的天数的字符串,如:Regex 需要帮助构造正则表达式吗,regex,string,regex-negation,Regex,String,Regex Negation,我需要编写一个正则表达式,它匹配表示一周中以逗号分隔的天数的字符串,如: "Sun,Mon,Tue,Wed,Thu,Fri,Sat" 每天最多可以在字符串中显示一次。日子的顺序很重要 到目前为止,我尝试了以下模式: 1) (周日、周一、周二、周三、周四、周五、周六)*(周日、周一、周二、周三、周四、周五、周六) 这是非常糟糕的:允许多天的存在,也不看天的顺序 2) 星期一星期二星期三星期四星期五星期六星期六星期五星期六 这是迄今为止我得到的最好的。这里唯一的问题是它匹配以逗号开头的字符串,例如
"Sun,Mon,Tue,Wed,Thu,Fri,Sat"
每天最多可以在字符串中显示一次。日子的顺序很重要
到目前为止,我尝试了以下模式:
1) (周日、周一、周二、周三、周四、周五、周六)*(周日、周一、周二、周三、周四、周五、周六)
这是非常糟糕的:允许多天的存在,也不看天的顺序
2) 星期一星期二星期三星期四星期五星期六星期六星期五星期六
这是迄今为止我得到的最好的。这里唯一的问题是它匹配以逗号开头的字符串,例如、Mon、Tue、Fri
。我的问题是如何筛选出匹配此模式的逗号起始字符串
提前感谢。这有点复杂,但它符合您的所有规格。也许regex不是解决这个问题的最佳方案
^(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
同意regex可能不是最好的选择。但是,如果当前版本的唯一问题是它与以逗号开头的字符串匹配,则可以在正则表达式的开头检查起始逗号:
(?!,)(Sun)?([,^]Mon)?([,^]Tue)?([,^]Wed)?([,^]Thu)?([,^]Fri)?([,^]Sat)?
但是,我不认为[,^]
做了你认为它做的事情-在我熟悉的正则表达式风格中,^
方括号内的^
与不是列表中第一个字符的文本^
匹配-它与字符串的开头不匹配。您可以将其替换为(^ |,)
:
另一种选择是创造性地使用: 或者,如果您不关心每天的拍摄,您可以进一步简化:
^\b(Sun)?,?\b(Mon)?,?\b(Tue)?,?\b(Wed)?,?\b(Thu)?,?\b(Fri)?,?\b(Sat)?$
\b
仅匹配单词字符和非单词字符。在本例中,介于日期和逗号或字符串边缘(开始或结束)之间。单词边界确保每个逗号都由字母包围:它永远不会与字符串边缘附近的逗号匹配。类似地,如果逗号不在那里,两天之间也不会匹配,如
SunMon
例如:我从
^(?:Sun)\b、\b(?:Mon)\b、\b(?:Tue)\b、\b(?:Wed)\b、\b(?:Thu)→b、\b(?:Fri)→b、\b(?:Sat)$
开始,但我认为简化版也应该可以使用:p
谢谢,我不知道方括号中的^
^\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)?$