Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何在重复模式中匹配重复模式而不指定两次备选方案?_Regex_Pcre - Fatal编程技术网

Regex 如何在重复模式中匹配重复模式而不指定两次备选方案?

Regex 如何在重复模式中匹配重复模式而不指定两次备选方案?,regex,pcre,Regex,Pcre,假设我有以下字符串,表示一天或多天或几天范围: mon,thu..fri,sun 如何使用正则表达式匹配任意范围列表或单个日期,而不将日期替代项展开两次 我目前有: (?P<weekdays> ( \b (mon|tue|wed|thu|fri|sat|sun) (\.\.(mon|tue|wed|thu|fri|sat|sun))? ,? )* ) (

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

mon,thu..fri,sun
如何使用正则表达式匹配任意范围列表或单个日期,而不将日期替代项展开两次

我目前有:

(?P<weekdays>
    (                        
        \b
        (mon|tue|wed|thu|fri|sat|sun)
        (\.\.(mon|tue|wed|thu|fri|sat|sun))?
        ,?
    )*
)
(?P
(                        
\b
(周一周二周三周四周五周六周日)
(\。\(周一周二周三周四周五周六周日)?
,?
)*
)
。。。这是可行的,但它迫使我在regex中重复白天的选择(这里简化了,但是更长!)。请注意,此正则表达式与
fri,sat,
匹配,因此可以选择以逗号结尾,这是所需的行为

我还尝试使用
{1,2}
将范围部分设置为有限重复,但我无法避免匹配无效的
mon..tue..fri
,因为模式通过可选的逗号重新启动

请注意,这是较长正则表达式的一部分,因此我不能使用全局标志

,其中我还添加了一些单元测试

小编辑:使用了\b元字符而不是负前瞻。

您可以试试这个

/(\bmon\b|\btue\b|\bwed\b|\bthu\b|\bfri\b|\bsat\b|\bsun\b)/g
你可以试试这个

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

您可以使用PCRE命名组,并在以后使用
(?&groupName)
构造重用子模式:

^(?)?
(                        
\b
(?周一周二周三周四周五周六周日)
(?:\.\(?&周))?
,?
)+
)$


要将定义与参考分开,请使用PCRE的
DEFINE
指令:

(?(定义)
(?周一周二周三周四周五周六周日)
)
^(?P
(?:                        
\b
(?&周)
(?:\.\(?&周))?
,?
)*
)$

您可以使用PCRE命名组,并在以后使用
(?&groupName)
构造重用子模式:

^(?)?
(                        
\b
(?周一周二周三周四周五周六周日)
(?:\.\(?&周))?
,?
)+
)$


要将定义与参考分开,请使用PCRE的
DEFINE
指令:

(?(定义)
(?周一周二周三周四周五周六周日)
)
^(?P
(?:                        
\b
(?&周)
(?:\.\(?&周))?
,?
)*
)$

请注意,您甚至不需要对捕获组或捕获组进行任何引用。玩单词边界就足够了:

\A \b
(?:
    (?: , |  \.\. )?                
    (?: mon|tue|wed|thu|fri|sat|sun) \b
)++
\z

请注意,您甚至不需要对捕获组或捕获组进行任何引用。玩单词边界就足够了:

\A \b
(?:
    (?: , |  \.\. )?                
    (?: mon|tue|wed|thu|fri|sat|sun) \b
)++
\z

谢谢。你能再详细一点吗?试一试如何?在这里应用边界元字符可能是一件有趣的事情,但是我不知道你的正则表达式与我的问题有什么关系(尽管有几天),谢谢。你能再详细一点吗?试一试如何?边界元字符在这里应用可能是一件有趣的事情,但是我不知道你的正则表达式与我的问题有什么关系(尽管好几天),我不知道你可以引用整个模式。请注意,最初的消极前瞻是没有必要的,显然
\b
起到了作用(以避免
tuetue
)。在您添加的部分中,您还使用了
(?&weeks))
,我想您的意思是只使用
(?&weeks)
确实
(?&weeks)
就足够了。我只是模仿了你原来的正则表达式,它有5个被捕获的组。我没有尝试清理/重构正则表达式。我会的now@ikegami:顺便说一句,这是我最初发布的答案,当时我想缩短总长度:)两者都很有用!我不确定为什么问题被标记为重复,解决方案可能类似,但我不一定要问重用模式,我想有一些方法可以做到这一点,而不引用模式。(顺便说一句,这个答案比“原件”中的答案好得多,也更完整。)@istepaniuk:是的,我同意,链接答案并不是一个真正的骗局。很好,我不知道你可以引用整个模式。请注意,最初的消极前瞻是没有必要的,显然
\b
起到了作用(以避免
tuetue
)。在您添加的部分中,您还使用了
(?&weeks))
,我想您的意思是只使用
(?&weeks)
确实
(?&weeks)
就足够了。我只是模仿了你原来的正则表达式,它有5个被捕获的组。我没有尝试清理/重构正则表达式。我会的now@ikegami:顺便说一句,这是我最初发布的答案,当时我想缩短总长度:)两者都很有用!我不确定为什么问题被标记为重复,解决方案可能类似,但我不一定要问重用模式,我想有一些方法可以做到这一点,而不引用模式。(顺便说一句,这个答案比“原件”中的答案好得多,也更完整。)@istepaniuk:是的,我同意,链接的答案并不是一个骗局。很有趣,但这会匹配“周一、周二、周五”的答案,对吗?您可以运行单元测试(在您提供的链接上)我们可以尝试以下操作:
^(?P(?:,,;)有趣,但这将与“mon..tue..fri”匹配,对吗?您可以运行单元测试(在您提供的链接上)我们可以尝试以下操作:
^(?P(?:,,;(?)?