我正在尝试从用户那里获取一些输入。
/mon,thu',
/mon',
/mon,thu,wed',
/mon,thu-sun'
/mon,tue-thu,sun'
所以“业务逻辑”是用户可以放下以下任何一个词
mon, tue, wed, thu, fri, sat, sun
它们可以用
分隔- or ,
如果它们被
分开-
任何一方都只能有一天,即
mon-wed
不
mon-wed-sun
如果用
分隔,
然后只有mon,tue,wed,thu,fri,sat,sun中的一个可以是它的任何一方。
基本上
,
代表一个特定的日子
-
代表一系列天数
我能得到的最接近的是:
(\bmon\b|\btue\b|\bwed\b|\bthu\b|\bfri\b|\bsat\b|\bsun\b)
答案 0 :(得分:2)
我想出了这个:
(mon|tue|wed|thu|fri|sat|sun)(, ?(mon|tue|wed|thu|fri|sat|sun))*(- ?(mon|tue|wed|thu|fri|sat|sun))?(, ?(mon|tue|wed|thu|fri|sat|sun))*
这里的想法是它匹配日(日)( - 日)?(,日)
符合以下条件:
mon,thu
mon
mon,thu,wed
mon,thu-sun
mon,tue-thu,sun
mon, tue, wed, thu, fri, sat, sun (even with spaces in ,)
mon-wed
但不是:
mon-wed-sun
答案 1 :(得分:0)
这将解决您的问题。基本上,将“mon”与“sun”匹配,然后是一个可选的逗号,后跟一个 - (?:,(?!-))?
,后跟一个重复的(0到1)-(mon to sun)
。
当mon-sun
的情况下,可选的逗号将使匹配失败,因此
将跳过,允许-
成功。
const logicalRE = /(mon|tue|wed|thu|fri|sat|sun)(?:,(?!-))??(?:-(mon|tue|wed|thu|fri|sat|sun)){0,1}/g;
/* cases */
const tCases = ["mon,thu", "mon", "mon,thu,wed", "mon,thu-sun", "mon,tue-thu,sun", "mon-wed-sun", "mon,-thu"]
tCases.forEach(tCase => {
console.log(tCase.match(logicalRE))
})
答案 2 :(得分:0)
如果您使用的是PCRE模式(或支持定义的任何其他正则表达方言),您可能不会一遍又一遍地重复工作日,例如:使用
(?(DEFINE)
(?<weekday>\b(?:mon|tue|wed|thu|fri|sat|sun)\b)
(?<field>(?&weekday)(?:-(?&weekday))?)
)
(?&field)(?:,(?&field))*
在详细模式下。见https://regex101.com/r/ELPd6V/1
请注意,这可以通过首先清理周围的混乱,然后应用锚点来获利,目前mon-tue-wed
会给你两个匹配。