Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
改进regex-pcre-php_Php_Regex_Pcre - Fatal编程技术网

改进regex-pcre-php

改进regex-pcre-php,php,regex,pcre,Php,Regex,Pcre,在我的项目(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

在我的项目(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/
/\s\d{2}(?!\d)|(?
这将匹配一个空格,然后两个数字后面不跟另一个数字,或者两个数字前面不跟一个数字,后面跟一个空格

(?!…)
为负前瞻。它表示“匹配后不能有此项。”


(?是负数look-behind,意思是“匹配之前不能有这个。”

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

preg_match('/[^0-9]?([0-9]{2})[^0-9]?/',$chanson['nom'],$resultPreg1)
你几乎可以在你的数字周围使用分词来获得你想要的东西,除非它找不到嵌入在字母“abc23def”中的数字


在这种情况下,示例将非常有效;-)我同意Jack的观点。如果您提供一些示例字符串,这个问题会更清楚。这将为您的问题提供上下文,并消除任何关于附带案例可能是什么样子的挥之不去的疑问。好的,谢谢。我不知道\d这么有用…所以我们可以使用| as or and&as and?是的,
表示或。如果您需要它,则仅适用于o部分对于模式,将其放在一个组中:
/(?:spl | dr)at/
匹配“splat”或“drat”。没有任何意义,因为默认情况下,模式必须匹配所有内容。@vekah,请参阅更新的第二个版本,它将匹配字符串开头或结尾的两位数字。@vekah,我不确定您的意思。
(?!*)
无效。@vekah,preg只捕获普通括号。具有特殊含义的括号,如
(?!…)
(?:…)
,等等。不捕获。任何时候括号中的第一个字符是
,都具有特殊含义,并且不是捕获组。
preg_match('/\b([0-9]{2})\b/',$chanson['nom'],$resultPreg1)