在我的项目(php)中,我得到了一些像这样的正则表达式(pcre):
preg_match('/[\s^0-9]{0,1}([0-9]{2})[\s^0-9]{0,1}/',$chanson['nom'],$resultPreg1)
此正则表达式捕获两个可以由单个空格分隔或不分隔的数字,并且不能由数字分隔。我想要做的是,开头有空格(没有数字),或者结尾有空格(没有数字)。但它必须至少有一个分隔符。
我怎样才能做到这一点 ?
您只需将其拆分并测试每个案例:
/\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,意思是“匹配不能在此之前”。
您不能在一组方括号中混合使用负字符和正字符类。可以写一个“空格”或“不是数字” \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)