如何在不指定两次备选方案的情况下匹配重复模式中的重复模式

  • 本文关键字:模式 方案 情况下 两次 regex pcre
  • 更新时间 :
  • 英文 :


假设我有以下字符串,表示一天或多天或一天的范围:

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

演示

相关内容

  • 没有找到相关文章

最新更新