改进regex-pcre-php
在我的项目(php)中,我得到了一些正则表达式(pcre),如下所示:改进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
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)