求助:仅接受逗号/空格分隔星期列表的正则表达式编写问题
解决星期几列表的正则验证问题
Hey there! Let's fix that regex issue you're having for validating weekday lists. First, let's break down what's wrong with your current regex:
原正则的问题
Your regex "\b(monday|tuesday|wednesday|thursday|friday|saturday|sunday|\b" has a couple of critical issues:
- 语法错误: 你有一个未闭合的括号,末尾还多了个
|\b,直接导致整个正则无法被解析。 - 未限制全字符串匹配: 没有使用
^(字符串开头)和$(字符串结尾)锚点,会导致正则匹配输入中的任意子串——哪怕输入里混了其他无效内容也能通过。 - 未处理分隔符逻辑: 没有考虑到多个星期几之间的空格或逗号分隔规则。
修正后的正则表达式
这里有一个能正确验证输入的正则,它支持空格、逗号,甚至逗号加空格(比如 monday, tuesday)作为分隔符:
^(monday|tuesday|wednesday|thursday|friday|saturday|sunday)(?:(?:,|\s)+(monday|tuesday|wednesday|thursday|friday|saturday|sunday))*$
逐部分解释
咱们拆解下每个部分的作用:
^: 锚定到输入字符串的开头——确保第一个星期几之前没有无效内容。(monday|tuesday|wednesday|thursday|friday|saturday|sunday): 匹配第一个合法的星期几(支持单个星期几的输入)。(?:(?:,|\s)+(...))*: 一个非捕获组,用来处理重复的星期几:(?:,|\s)+: 匹配一个或多个分隔符(逗号、空格,或者两者混合比如,)。- 内部的星期几分组会再次匹配一个合法的星期几。
*允许这个「分隔符+星期几」的模式重复0次或多次(所以单个星期几的输入也能通过)。
$: 锚定到输入字符串的结尾——确保最后一个星期几之后没有无效内容。
额外优化:不区分大小写
如果你想接受大写或混合大小写的输入(比如 Monday 或 TUESDAY),可以根据你的正则引擎添加不区分大小写修饰符(通常是末尾加 i):
/^(monday|tuesday|wednesday|thursday|friday|saturday|sunday)(?:(?:,|\s)+(monday|tuesday|wednesday|thursday|friday|saturday|sunday))*$/i
测试用例
匹配的有效输入:
monday tuesday saturdaymonday,tuesday,saturdaymonday, tuesday sundayfriday
不匹配的无效输入:
monday holiday(包含非星期几的词汇)monday,tues(无效的星期几缩写)123 sunday(包含非文本字符)- 空字符串
可选:禁止重复星期几
如果你想阻止重复的星期几输入(比如 monday monday),正则会需要用到负向预查变得复杂一些,如果需要的话可以告诉我!
内容的提问来源于stack exchange,提问作者Ahmed Mhadhbi
相关产品推荐
相关产品推荐

