繁体   English   中英

在正则表达式末尾将组设为可选会导致其永不匹配

[英]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不再提取日期。 我怀疑。*正在接管,但似乎无法理解

(.*) --> (.*?)

在这里阅读更多关于惰性量词的信息:

http://www.regular-expressions.info/repeat.html

正如您所假定的, .* (贪婪的量词)会消耗太多信息。 这可以通过使其变得懒惰或将其替换为诸如[^[]*其他东西来解决。 但是,将其替换为后一种建议将不允许在字符串中使用任何文字[

除了解决此问题,您还应该做的是学会对不需要保存的部分使用非捕获组。 这将加快您的正则表达式并节省一些内存。

这是我为您解决的问题。 变化不大,但是我相信您可以发现差异。

/(([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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM