首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法解决这个复杂的Regex

无法解决这个复杂的Regex
EN

Stack Overflow用户
提问于 2013-03-14 11:25:20
回答 3查看 95关注 0票数 1

下面是一些例子。我需要的是移除特定线路中的定时部分。例如:

欧足联联播节目上午8时至上午10时

我只需要:

欧足联联播

我是新来的。有人能指点我吗。

下面是我正在使用的一些示例字符串:

  • 欧足联第8届联赛上午8点至上午10点
  • MLB:芝加哥白袜队在洛杉矶天使队晚上8点-上午11点
  • MLB之春:芝加哥小熊队在洛杉矶道奇队上午8点至晚上11点
  • 新西兰对英格兰的现场测试:第二测试日上午9:00-凌晨5:00
  • 欧足联高层晚上10:00-11:00
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-14 11:32:35

代码语言:javascript
复制
<?php

$str = array("Uefa Europa League Simulcast 8.00am-10.00Am",
"MLB: Chicago White Sox at Los Angeles Angels 8.00PM-11.00AM",
"MLB Spring: Chicago Cubs at Los Angeles Dodgers 8.00aM-11.00PM",
"Live Test Cricket New Zealand v England: Second Test Day Two 9:00am-5:00am",
"UEFA Europa League Hightlights 10.00pm-11.00pm");


foreach ($str as $s) {
   $new = preg_replace('/\s*\d?\d[\.\:]\d\d[ap]m-\d?\d[\.\:]\d\d[ap]m\s*$/i', '', $s);
   echo "$new\n";
}

输出

代码语言:javascript
复制
Uefa Europa League Simulcast
MLB: Chicago White Sox at Los Angeles Angels
MLB Spring: Chicago Cubs at Los Angeles Dodgers
Live Test Cricket New Zealand v England: Second Test Day Two
UEFA Europa League Hightlights

/\s*\d?\d[\.\:]\d\d[ap]m-\d?\d[\.\:]\d\d[ap]m\s*$/i的解释

  • \s*意味着零或多个空白空间
  • \d?指的是一位或零位
  • \d是指一个数字
  • [\.\:]的意思是.:
  • [ap]的意思是ap
  • $表示字符串的结尾
  • /.../i表示不区分大小写
票数 5
EN

Stack Overflow用户

发布于 2013-03-14 11:38:20

不需要正则表达式-您只需在最后一个空格修剪字符串:

代码语言:javascript
复制
<?php

$str = array(
    "Uefa Europa League Simulcast 8.00am-10.00Am",
    "MLB: Chicago White Sox at Los Angeles Angels 8.00PM-11.00AM",
    "MLB Spring: Chicago Cubs at Los Angeles Dodgers 8.00aM-11.00PM",
    "Live Test Cricket New Zealand v England: Second Test Day Two 9:00am-5:00am",
    "UEFA Europa League Hightlights 10.00pm-11.00pm"
);

foreach ($str as $s) {
    $trimmed = substr($s, 0, strrpos($s, ' '));
    echo "$trimmed\n";
}

?>
票数 1
EN

Stack Overflow用户

发布于 2013-03-14 11:38:35

正则表达式只匹配正则字符串,因此让我们分解您提供的示例字符串,并寻找一些规律性:

代码语言:javascript
复制
8.00am-10.00Am
8.00PM-11.00AM
8.00PM-11.00AM
8.00PM-11.00AM
10.00pm-11.00pm

所以我可以看到:

  • 它总是以一位或两位数开头。这可以表示为\d{1,2}
  • 后面跟着点.或冒号:。这可以表示为[.:]
  • 后面总是有2位数字:\d{2}
  • 然后是字符串AMPM,大小写不敏感。为了使用不区分大小写的方法,我们可以对整个模式使用i修饰符,因此我们只需要匹配ampm,即编写成(am|pm)。这将表现为一个捕获组,我们不需要捕获,因此我们可以使用非捕获组(?:am|pm)优化表达式。
  • 然后是一个破折号-,这可以用字面来表达。
  • 然后重复模式的第一部分。

所以,当我们把它们放在一起的时候,我们会得到:

代码语言:javascript
复制
/\d{1,2}[.:]\d{2}(?:am|pm)-\d{1,2}[.:]\d{2}(?:am|pm)/i

但是等等..。这将在主题字符串的末尾留下尾随空格。好的,我们只需要关闭trim(),但是我们也可以获得正则表达式来处理这个问题,方法是将\s*放在模式的前面。

代码语言:javascript
复制
/\s*\d{1,2}[.:]\d{2}(?:am|pm)-\d{1,2}[.:]\d{2}(?:am|pm)/i

所以现在我们只需要用一个空字符串替换任何匹配这个模式的东西。您可以使用preg_replace()在PHP中完成此操作。

代码语言:javascript
复制
$pattern = '/\s*\d{1,2}[.:]\d{2}(?:am|pm)-\d{1,2}[.:]\d{2}(?:am|pm)/i';
$string = 'Uefa Europa League Simulcast 8.00am-10.00Am';

$string = preg_replace($pattern, '', $string);

var_dump($string);

看到它起作用

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15407894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档