假设我有以下一行:
1309270927C1642,61N654NONREF
现在我希望在第一个数字后面得到C
或D
。现在这里有一些规则
D
或C
。现在我想以后面的方式解决这个问题:
/(?<=\d{6,10})D|C/
但PHP中不允许这样做。
所以我尝试了非捕获组/(?:\d{6,10})D|C/
。但这会捕获1309270927C
,而不仅仅是C
。
所以我的问题是如何捕获D
或C
?
答案 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]
它将省略匹配中D
或C
的所有内容。您可以进一步调整此正则表达式,允许或禁止更多字符到字符类[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