【问题标题】:Regexp grab all text following last match正则表达式抓取最后一场比赛之后的所有文本
【发布时间】:2013-08-09 18:03:50
【问题描述】:

我试图抓取字符串中最后一个数字之后的文本,如果它不包含数字,则抓取整个字符串。

我能想到的最好的正则表达式是:

([^\d\s]*)$

但是我发现 mysql 正则表达式不支持 \s 和 \d 而不是 [[:space:]] 并且不确定什么 \d 也是等效的。

这就是我想要完成的:

'1/2 Oz' returns 'Oz'
'2 3/4 Oz' returns 'Oz'
'As needed' returns 'As needed'

【问题讨论】:

  • [^[:digit:][:space:]]?

标签: php mysql regex


【解决方案1】:

这是您需要的正则表达式:

/^.*?(\d+(?=\D*$)\s*)/

只需将匹配的文本替换为空字符串""

PHP 代码:

$s = preg_replace('/^.*?(\d+(?=\D*$)\s*)/', '', 'Foo Oz');
//=> Foo Oz

$s = preg_replace('/^.*?(\d+(?=\D*$)\s*)/', '', '1/2 Oz');
//=> Oz

现场演示:http://ideone.com/u887D7

【讨论】:

  • 这需要一个数字。
  • @m.buettner: preg_replace('/^.*?(\d+(?=\D*$)\s*)/', '', 'Foo Oz') 返回整个字符串。
  • 哦,对了,您正在替换,而不是匹配。你确定这会转化为 mysql 吗?
  • 老实说,我不确定 OP 用哪种语言编写代码。据我所知,MySQL 在 SQL 中没有 preg_replace 的等价物。
  • 我试图在纯 mysql 中执行此操作,但对于这种情况,在 PHP 中似乎更容易处理
【解决方案2】:

首先,您可以简单地避免使用该类,而是使用范围:

[^0-9[:space:]]*$

但也有一个用于数字的(实际上可能包括非 ASCII 数字)。 documentation has a list of these。顺便说一下,它们被称为POSIX bracket expressions。

[^[:digit:][:space:]]*$

但是,这种方法的一般问题是它不允许字符串后面的空格(例如As 和needed 之间的空格。要获得这些,但仍要避免在数字后捕获尾随空格, 确保第一个字符既不是空格也不是数字,然后将字符串的其余部分匹配为非数字。此外,将整个内容设为可选,以确保它仍然适用于以数字结尾的字符串。

([^[:digit:][:space:]][^:digit:]*)?$

【讨论】:

    猜你喜欢
    • 2021-03-29
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 2016-05-16
    • 2013-07-06
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多