可以为最后一个单词和数字组合正则表达式吗?

我有一个示例字符串,例如

September 14-20, 26, 28-30, October 1-8, 10, 11, 15-20, 24, November 25, 28-30

使用时(\w+)$,会捕获30。是否可以使用单个表达式同时捕获NovemberAND 30


慕丝7291255
浏览 153回答 3
3回答

DIEA

考虑到示例字符串的格式,您可以使用重复组并使用 2 个捕获组,其中第一个包含月份名称,第二个是最后出现的 1 个或多个数字^(?:[A-Za-z]+ \d+(?:-\d+)?(?:, \d+(?:-\d+)?)*, )*([A-Za-z]+)(?: \d+(?:-\d+)?,)* (?:\d+-)?(\d+)$解释^ 字符串的开始(?: 非捕获组[A-Za-z]+ \d+ 匹配 1+ a-zA-Z、空格和 1+ 数字(?:-\d+)? 可选择匹配连字符和 1+ 位数字(?:, \d+(?:-\d+)?)*,  重复 0+ 次匹配逗号、1+ 位数字和可选的连字符和 1+ 位数字)* 关闭非捕获组,重复 0+ 次( 捕获组 1[A-Za-z]+)(?: \d+(?:-\d+)?,)*  关闭第 1 组,重复 0+ 次并匹配一个空格(?:\d+-)? 匹配可选的 1+ 位数字和连字符(\d+) 捕获第 2 组,匹配 1+ 个数字$ 字符串结束正则表达式演示

慕斯王

一种不同的方法,不是更好或更坏(在我看来)是将字符串分成几部分,然后选择你需要的。这样做的好处是将所有内容都放在数组中,因此您可以很容易地选择其他月份和日期。$str = 'September 14-20, 26, 28-30, October 1-8, 10, 11, 15-20, 24, November 25, 28-30';//Explode on [' ', ',', ', ', '-']    $arr = explode(" ", str_replace(['-', ', '], ' ', $str));$months = preg_grep("/\D+/", $arr); // find the months$LastMonth = end($months);$LastDay = end($arr);var_dump($LastMonth, $LastDay); //November, 30https://3v4l.org/GiqtI这也可以这样编写,您可以使用 substr 和 strpos 重新创建完整的月份字符串或选择范围 (28-30) 中的最后几天,或者像这样发布最后一个月的内容:https://3v4l。组织/PBAXU

慕哥9229398

我们可以preg_match在这里尝试使用:$input = "September 14-20, 26, 28-30, October 1-8, 10, 11, 15-20, 24, November 25, 28-30";preg_match('/.*\b([A-Za-z]+).*\b(\d+)$/', $input, $matches);echo "month is: " . $matches[1] . "\n";echo "last day is: " . $matches[2];这打印:month is: Novemberlast day is: 30
打开App,查看更多内容
随时随地看视频慕课网APP