如何使用正则表达式获取数字后面的字符

时间:2015-04-08 12:39:54

标签: php regex

假设我有以下一行:

1309270927C1642,61N654NONREF

现在我希望在第一个数字后面得到CD。现在这里有一些规则

  1. 前6位数字始终存在
  2. 之后的4位数字是可选的
  3. 之后您有DC
  4. 现在我想以后面的方式解决这个问题:

    /(?<=\d{6,10})D|C/但PHP中不允许这样做。

    所以我尝试了非捕获组/(?:\d{6,10})D|C/。但这会捕获1309270927C,而不仅仅是C

    所以我的问题是如何捕获DC

2 个答案:

答案 0 :(得分:3)

我会使用capturing subpattern,如下所示:

$string = "1309270927C1642,61N654NONREF";
$pattern = '/\d{6,10}(C|D)/';
preg_match($pattern, $string, $matches);
// $matches[1] contains the contents of the first subpattern
echo $matches[1];

答案 1 :(得分:2)

您可以使用PCRE \K运算符:

\d{6,10}\K[DC]

它将省略匹配中DC的所有内容。您可以进一步调整此正则表达式,允许或禁止更多字符到字符类[DC]

查看example

示例代码:

$re = "/\\d{6,10}\\K[DC]/"; 
$str = "1309270927C1642,61N654NONREF"; 
preg_match_all($re, $str, $matches);

此外,\K运算符上还有一些more information

  

The \K "keep out" verb, which is available in Perl, PCRE (C, PHP, R…)   and Ruby 2+. \K tells the engine to drop whatever it has matched so   far from the match to be returned.

     

Instead of (?<=\b\d+_)[A-Z]+, you can therefore use \b\d+_\K[A-Z]+

\K的限制:

与lookbehinds相比,\ K和捕获组的变通方法都有局限性:

  

✽当您在字符串中查找多个匹配项时,在开始时   每次比赛尝试的位置,一个lookbehind可以检查   字符串中当前位置后面的字符。因此,   对比123,模式(?&lt; = \ d)\ d(匹配以数字开头的数字)   将匹配2和3.相比之下,\ d \ K \ d只能匹配2,因为   第一场比赛后的起始位置紧接在3之前,   并且没有足够的数字留给第二场比赛。同样,   \ d(\ d)只能捕获2.

     

✽有了外观,你可以施加多种条件(类似于我们的   密码验证技术)通过使用多个lookbehinds。对于   例如,匹配一个以小写希腊语开头的数字   字母,您可以使用(?&lt; = \ p {Ll})(?&lt; = \ p {Greek})\ d。第一个看后面   (?&lt; = \ p {Ll})确保左边的字符是a   小写字母和第二个lookbehind(?&lt; = \ p {Greek})确保   左边的人物属于希腊人   脚本。通过变通方法,您可以使用\ p {Greek} \ K \ d来匹配a   数字前面是希腊文字符中的字符(或\ p {希腊语}(\ d)到   抓住它),但你不能强加第二个条件。去克服   这个限制,你可以捕获希腊字符并使用   第二个正则表达式,检查它是否为小写字母。

输出:

C