PHP RegEx在字符集后获得第一个字母

时间:2014-06-15 13:04:51

标签: php regex

我有一些带有标题字符串和字母集的文本。 我需要在字符串字符集后得到第一个一位数字。

示例文字:

ABC105001
ABC205001
ABC305001
ABCD105001
ABCD205001
ABCD305001

我的RegEx:

^(\D*)(\d{1})(?=\d*$)

链接: http://www.regexr.com/390gv

正如您所见,RegEx工作正常,但它也会捕获结果中的第一组。我只需要获得这个整数,当我尝试将 ?= 放在第一组中时:^(?=\D*)(\d{1})(?=\d*$),Regex无法正常工作。

有什么想法吗?

提前致谢。

3 个答案:

答案 0 :(得分:2)

(?=..)是一个先行,意味着后跟并检查当前位置右侧的字符串。

(?<=...)是一个后视,意味着开头,并检查当前位置左侧的字符串。

这两个功能的有趣之处在于,内部匹配的内容不是整个匹配结果的一部分。唯一的问题是,lookbehind不能匹配可变长度的内容。

避免此问题的一种方法是使用\K功能删除匹配结果左侧的所有内容:

^[A-Z]+\K\d(?=\d*$)

答案 1 :(得分:1)

当你真的想要使用非捕获组时,你正试图使用​​积极的前瞻。

您想要的一个匹配将使用此正则表达式:

^(?:\D*\d{1})(\d*)$

(?:字符串将启动非捕获组。这不会在比赛中回归。

因此,如果您使用preg_match(';^(?:\D*\d{1})(\d*)$;', $string, $matches)查找匹配项,$matches[1]将是您正在查找的字符串。 (这是因为$matches[0]始终是preg_match的完全匹配。)

答案 2 :(得分:1)

尝试:

^(?:\D*)(\d{1})(?=\d*$) // (?: is the beginning of a no capture group