正则表达式抓住最后一场比赛后的所有文字

时间:2013-08-09 18:03:50

标签: php mysql regex

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

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

([^\d\s]*)$

但是我发现在mysql regexp而不是[[:space:]]中不支持\ s和\ d,也不确定\ d也是等价的。

这就是我想要完成的事情:

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

2 个答案:

答案 0 :(得分:2)

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

/^.*?(\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

答案 1 :(得分:2)

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

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

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

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

然而,这种方法的一般问题是它不允许以后在字符串中使用空格(如Asneeded之间的空格。要获得这些空格,但仍然避免捕获在数字后跟踪空格,确保第一个字符既不是空格也不是数字,然后将字符串的其余部分与非数字匹配。此外,使整个事物可选,以确保它仍然适用于以数字结尾的字符串

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