php - 2 个字符串之间的正则表达式匹配

标签 php regex match preg-match-all

例如我有文字

a1aabca2aa3adefa4a

我想使用 abc 和 def 之间的正则表达式提取 2 和 3,因此 1 和 4 不应包含在结果中。

我试过了

if(preg_match_all('#abc(?:a(\d)a)+def#is', file_get_contents('test.txt'), $m, PREG_SET_ORDER))
  print_r($m);

我明白了

> Array
(
    [0] => Array
        (
            [0] => abca1aa2adef
            [1] => 3
        )

)

但我想要这个

Array
(
    [0] => Array
        (
            [0] => abca1aa2adef
            [1] => 2
            [2] => 3
        )

)

这可以通过一次 preg_match_all 调用实现吗?我该怎么做?

谢谢

最佳答案

preg_match_all(
    '/\d       # match a digit
    (?=.*def)  # only if followed by <anything> + def
    (?!.*abc)  # and not followed by <anything> + abc
    /x', 
    $subject, $result, PREG_PATTERN_ORDER);
$result = $result[0];

适用于您的示例。它假定字符串中的每一行只有一个 abcdef 实例。

您的尝试失败的原因是与该数字匹配的捕获组 (\d) 位于另一个重复的组 (?:a(\d)a 中)+。每次重复,捕获的结果都会被覆盖。这就是正则表达式的工作原理。

换句话说 - 看看比赛期间发生了什么:

Current position    Current part of regex    Capturing group 1
--------------------------------------------------------------
a1a                 no match, advancing...   undefined
   abc              abc                      undefined
      a2a           (?:a(\d)a)               2
         a3a        (?:a(\d)a) (repeated)    3 (overwrites 2)
            def     def                      3

关于php - 2 个字符串之间的正则表达式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7401559/

相关文章:

regex - 如何在没有 Cargo 的情况下在 Rust 中使用正则表达式?

C# 字符串操作

javascript - 将 Javascript 对象传递给 PHP JSON 解码

php - 拉维尔 5 : Data does not saved through blade form

php - 使用 php 对 mysql 记录进行高级/技术排序

python - 查找图像包含其他图像

\b 和国际字符的 Javascript 正则表达式问题

php - 用于 HTML 标记转换的正则表达式

java - 具有重复的正则表达式排列

java - 正则表达式允许 1.00、.10 或 10。但不允许单个小数