【问题标题】:regex how to match specific words and specific delimeters正则表达式如何匹配特定单词和特定分隔符
【发布时间】:2017-08-01 05:39:28
【问题描述】:

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

            /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

如果用a分隔

,

那么只有周一、周二、周三、周四、周五、周六、周日可以在它的任一侧。

基本上 , 代表特定的一天和 - 代表天的范围

我能得到的最接近的是:

(\bmon\b|\btue\b|\bwed\b|\bthu\b|\bfri\b|\bsat\b|\bsun\b)

【问题讨论】:

  • 是什么让您认为正则表达式本身就是解决此问题的正确工具?
  • 您使用的是什么正则表达式引擎(语言/工具)?
  • 我在 python 中编写逻辑来读取 aws rds 标签。我不确定正则表达式是否是该问题的最佳解决方案,但它似乎是一个不错的起点。哇很多惊人的答案谢谢,伙计们!回想起来,我认为尝试放入正则表达式的逻辑太多。这个问题可能更适合分解数据,然后对每个小块应用规则

标签: regex


【解决方案1】:

我想出了这个:

(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))*

这里的想法是它匹配 day(,day)(-day)?(,day)

符合以下条件:

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

【讨论】:

  • 我认为你不应该在正则表达式中有 ^$。他的日子不在行的开头或结尾。
  • 不错的尝试!但是为什么所有不需要的捕获组都伤害了我的眼睛!
【解决方案2】:

如果您使用 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 将为您提供两个匹配项。

【讨论】:

    【解决方案3】:

    这将解决您的问题。基本上,将“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

    【讨论】:

    • 你的正则表达式匹配tue-thu-fri
    • @Barmar 啊,它没有添加到案例中,所以我没有考虑它,它现在已修复。
    • 它也匹配mon,-thu
    • @Barmar haha​​.. 添加到测试用例并修复了正则表达式!
    猜你喜欢
    • 2013-06-10
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    相关资源
    最近更新 更多