假设我有以下字符串,表示一天或多天或一天的范围:
mon,thu..fri,sun
如何将任意范围列表或单个日期与正则表达式进行匹配,而不将日期备选项扩展两次?
我现在有这个:
(?P<weekdays>
(
b
(mon|tue|wed|thu|fri|sat|sun)
(..(mon|tue|wed|thu|fri|sat|sun))?
,?
)*
)
这是有效的,但它迫使我在regex中重复当天的备选方案(这里简化了,但更长!(。请注意,此正则表达式与fri,sat,
匹配,因此可以选择以逗号结尾,这是所需的行为。
我还尝试使用{1,2}
使范围部分进行有限的重复,但我无法避免匹配无效的mon..tue..fri
,因为模式通过可选逗号重新启动。
注意,这是一个较长regex的一部分,所以我不能使用全局标志。
这是Regex101的URL,我还在其中添加了一些单元测试。
小编辑:使用了\b元字符,而不是负面前瞻。
您可以使用PCRE命名的组,然后使用(?&groupName)
构造重用子模式:
^(?<weekdays>
(
b
(?<weeks>mon|tue|wed|thu|fri|sat|sun)
(?:..(?&weeks))?
,?
)+
)$
RegEx演示
要将定义与引用分开,请使用PCRE:的DEFINE
指令
(?(DEFINE)
(?<weeks>mon|tue|wed|thu|fri|sat|sun)
)
^(?P<weekdays>
(?:
b
(?&weeks)
(?:..(?&weeks))?
,?
)*
)$
RegEx Demo 2
你可以试试这个
/(bmonb|btueb|bwedb|bthub|bfrib|bsatb|bsunb)/g
请注意,您甚至不需要对捕获组或捕获组的引用来进行尝试。使用单词边界就足够了:
A b
(?:
(?: , | .. )?
(?: mon|tue|wed|thu|fri|sat|sun) b
)++
z
演示