Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 需要帮助构造正则表达式吗_Regex_String_Regex Negation - Fatal编程技术网

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)?$