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


Simple REGEX square bracket negative matching or beginning of string?

使用PHP的preg_match函数,我遇到了一个可能很简单但令人恼火的regex问题

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

我现在拥有的当前正则表达式可以工作,但在字符串开头不匹配。

正则表达式是

/[^'+][?'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,因为它是第一个前面没有+-正确的数字


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

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

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

(?:表示不匹配的括号,而只是起始的^或预匹配的[^'+][?'s]

编辑:

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

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

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

顺便说一句,请注意,当数字后面没有空格时,此regexp也会匹配。我不知道这是不是你想要的。