为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
慕丝7291255 2021-11-05 14:44:24
我有一个示例字符串,例如September 14-20, 26, 28-30, October 1-8, 10, 11, 15-20, 24, November 25, 28-30使用时(\w+)$,会捕获30。是否可以使用单个表达式同时捕获NovemberAND 30?
查看完整描述

3 回答

?
DIEA

TA贡献1820条经验 获得超2个赞

考虑到示例字符串的格式,您可以使用重复组并使用 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+ 个数字

  • $ 字符串结束

正则表达式演示


查看完整回答
反对 回复 2021-11-05
?
慕斯王

TA贡献1864条经验 获得超2个赞

一种不同的方法,不是更好或更坏(在我看来)是将字符串分成几部分,然后选择你需要的。

这样做的好处是将所有内容都放在数组中,因此您可以很容易地选择其他月份和日期。


$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, 30

https://3v4l.org/GiqtI


这也可以这样编写,您可以使用 substr 和 strpos 重新创建完整的月份字符串或选择范围 (28-30) 中的最后几天,或者像这样发布最后一个月的内容:

https://3v4l。组织/PBAXU


查看完整回答
反对 回复 2021-11-05
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

我们可以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: November

last day is: 30


查看完整回答
反对 回复 2021-11-05
  • 3 回答
  • 0 关注
  • 152 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信