0

在我的项目(php)中,我得到了一些像这样的正则表达式(pcre):

preg_match('/[\s^0-9]{0,1}([0-9]{2})[\s^0-9]{0,1}/',$chanson['nom'],$resultPreg1)

此正则表达式捕获两个可以由单个空格分隔或不分隔的数字,并且不能由数字分隔。我想要做的是,开头有空格(没有数字),或者结尾有空格(没有数字)。但它必须至少有一个分隔符。

我怎样才能做到这一点 ?

4

2 回答 2

1

您只需将其拆分并测试每个案例:

/\s\d{2}\D|\D\d{2}\s/

这将匹配一个空格、两个数字和任何非数字字符一个非数字字符、两个数字和一个空格。

注:\d是一个数字,相当于[0-9]\D是一个非数字,等价于[^0-9]

但是,上述正则表达式要求数字的每一侧至少有一个非数字。另外,如果你有一个类似的模式.11 22.,它不会匹配两个数字,因为空间会被第一个匹配吃掉。如果这是一个问题,您可以使用环视:

/\s\d{2}(?!\d)|(?<!\d)\d{2}\s/

这匹配一个空格,然后是两个数字后面没有另一个数字,或者两个数字前面没有一个数字,后面跟着一个空格。

(?!...)是负前瞻。它的意思是“比赛不能跟这个”。

(?<!...)是否定的look-behind,意思是“匹配不能在此之前”。

于 2013-02-26T11:31:52.280 回答
0

您不能在一组方括号中混合使用负字符和正字符类。可以写一个“空格”或“不是数字” \s|[^0-9]。但是空格不是数字,所以不需要特别输入,[^0-9]你就够了。您的“零或一”的语法在{0,1}技术上是正确的,但同样的事情有一个更简洁的语法:?.

preg_match('/[^0-9]?([0-9]{2})[^0-9]?/',$chanson['nom'],$resultPreg1)

您几乎可以在您的号码周围使用分词符来获取您要查找的内容,除非它找不到嵌入在“abc23def”之类的字母中的数字。

preg_match('/\b([0-9]{2})\b/',$chanson['nom'],$resultPreg1)
于 2013-02-26T11:35:53.523 回答