正则表达式如何匹配特定的单词和特定的分隔符

时间:2017-08-01 05:39:28

标签: regex

我正在尝试从用户那里获取一些输入。

            /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)

3 个答案:

答案 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))
})

演示链接:https://regex101.com/r/BcqUye/5

答案 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会给你两个匹配。