简单的REGEX方括号负匹配或字符串的开头?

时间:2015-02-26 08:16:11

标签: php regex preg-match preg-match-all regex-negation

使用PHP的preg_match函数,我有一个简单但令人恼火的正则表达式问题

基本上,我希望匹配任何不以+开头的数字,并且仍然匹配字符串的开头。

我现在使用的当前正则表达式正在工作但在字符串的开头没有匹配。

正则表达式是

/[^\+][?\s]((\d+)?([.,])?\d+)/

这是一些测试输入和它应该捕获的预期值。


test 10 test

抓住10 - 正确。


10 test test

不会抓到10,但它应该 - 不正确。


+10 test test

不会捕获10,因为它以加号开头 - 正确。


test + 10 test test

不会捕获10,因为它以加号开头并且在加号和数字之间有可选空格 - 正确


测试+10 13 51 23

捕获13,因为它是第一个不以+ - 正确

开头的数字

所以简单的问题是,如何使方括号中的负数运算符与+符号不匹配,但如果数字位于字符串的最开头仍然有效?

1 个答案:

答案 0 :(得分:1)

好吧,你必须用字符串而不是+或行的开头替换你的正则表达式的字符串而不是+ 部分

/(?:^|[^\+][?\s])((\d+)?([.,])?\d+)/

(?:代表不匹配的括号,只是开头的^或您的赛前[^\+][?\s]

编辑:

像Braydon Batungbacal说的那样,这并不是你想要的,因为10 test的正则表达式失败了。我想我们可以这样做:

/(^|[^\+])(^|[?\s])((\d+)?([.,])?\d+)/

这很有效,但我觉得它并不令人满意。如果有人找到了更好的解决方案......

顺便说一下,请注意,当数字后没有空格时,此正则表达式也会匹配。我不知道这是不是你想要的。