[英]Making group optional at end of regex causes it to be never matched
我在PHP中有一个正则表达式来匹配这样的一些文本:
第24次会议-褐狐速食[2012年1月10日至2012年9月26日]
我提出的模式如下所示:
$pattern = "/(([0-9]{1,2})(st|nd|rd|th)\sMeeting\s-\s)?(.*)(\[([0-9]{1,2}\s(January|February|March|April|May|June|July|August|September|November|December)\s[0-9]{4})\sto\s([0-9]{1,2}\s(January|February|March|April|May|June|July|August|September|November|December)\s[0-9]{4})\])$/"
这似乎很好。
但是,我希望最后的日期部分是可选的。 但是,当我添加一个? 在日期分组之后,如果字符串中包含日期,则preg_match不再提取日期。 我怀疑。*正在接管,但似乎无法理解
正如您所假定的, .*
(贪婪的量词)会消耗太多信息。 这可以通过使其变得懒惰或将其替换为诸如[^[]*
其他东西来解决。 但是,将其替换为后一种建议将不允许在字符串中使用任何文字[
。
除了解决此问题,您还应该做的是学会对不需要保存的部分使用非捕获组。 这将加快您的正则表达式并节省一些内存。
这是我为您解决的问题。 变化不大,但是我相信您可以发现差异。
/(([0-9]{1,2})(st|nd|rd|th)\sMeeting\s-\s)?(.*)(\[([0-9]{1,2}\s(January|February|March|April|May|June|July|August|September|November|December)\s[0-9]{4})\sto\s([0-9]{1,2}\s(January|February|March|April|May|June|July|August|September|November|December)\s[0-9]{4})\])?$/
您可以在此处查看演示和正则表达式的解释: http : //regex101.com/r/vZ1nH6
该网站使用PHP,因此可以准确解决您的问题。 如果您有兴趣了解更多信息,建议您在www.regular-expressions.info上阅读正则表达式,并在http://www.regex101.com/quiz/上浏览测验。
这个小的变化就可以做到(粗体)
/(([0-9]{1,2})(st|nd|rd|th)\\sMeeting\\s-\\s)?
(.*?)
(\\[([0-9]{1,2}\\s(January|February|March|April|May|June|July|August|September|November|December)\\s[0-9]{4})\\sto\\s([0-9]{1,2}\\s(January|February|March|April|May|June|July|August|September|November|December)\\s[0-9]{4})\\]
|$
)$/
首先,自由文本表达式由?
扩展?
使它变得不和谐(请参阅其他文章)
在日期部分后面加上|$
,以告诉它确切地是字符串的日期或结尾。
这是您的总正则表达式
/(([0-9]{1,2})(st|nd|rd|th)\\sMeeting\\s-\\s)?(.*?)(\\[([0-9]{1,2}\\s(January|February|March|April|May|June|July|August|September|November|December)\\s[0-9]{4})\\sto\\s([0-9]{1,2}\\s(January|February|March|April|May|June|July|August|September|November|December)\\s[0-9]{4})\\]|$)$/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.