代码之家  ›  专栏  ›  技术社区  ›  ZachTurn

在多行上捕获相同的正则表达式

  •  0
  • ZachTurn  · 技术社区  · 8 年前

    # Input
    # data/raw/file1
    # data/raw/file2
    
    # Output
    # data/interim/file1
    # data/interim/file2
    

    当前尝试

    # Input\n(# (.*))

    我的内部捕获组正确捕获 data/raw/file1

    期望输出

    我想要的是抓取中间的所有文件 # Input # Output ,所以在这个例子中, 数据/原始/文件1 data/raw/file2

    2 回复  |  直到 8 年前
        1
  •  2
  •   Community Mohan Dere    6 年前

    配合 \G 魔术:

    (?:^#\s+Input|\G(?!\A))\R*(?!#\s+Output)#\s*(.*)|[\s\S]*
    

    Live demo

    正则表达式分解

    (?:                 # Start of non-capturing group (a)
        ^#\s+Input          # Match a line beginning with `# Input`
        |                   # Or
        \G(?!\A)            # Continue from previous successful match point
    )                   # End of NCG (a)
    \R*                 # Match any kind of newline characters
    (?!#\s+Output)      # Which are not followed by such a line `# Output`
    #\s*(.*)            # Start matching a path line and capture path
    |                   # If previous patterns didn't match....
    [\s\S]*             # Then match everything else up to end to not involve engine a lot
    

    PHP代码:

    $re = '~(?:^#\s+Input|\G(?!\A))\R*(?!#\s+Output)#\s*(.*)|[\s\S]*~m';
    $str = '# Input
    # data/raw/file1
    # data/raw/file2
    
    # Output
    # data/interim/file1
    # data/interim/file2';
    
    preg_match_all($re, $str, $matches, PREG_PATTERN_ORDER, 0);
    
    // Print the entire match result
    print_r(array_filter($matches[1]));
    

    输出:

    Array
    (
        [0] => data/raw/file1
        [1] => data/raw/file2
    )
    
        2
  •  2
  •   chris85 Ferenc Kurucz    8 年前

    使用 s 修饰符, preg_match preg_split 你可以自己得到每个结果。

    preg_match('/# Input\n(# (?:.*?))# Output/s', '# Input
    # data/raw/file1
    # data/raw/file2
    
    # Output
    # data/interim/file1
    # data/interim/file2', $match);
    $matched = preg_split('/# /', $match[1], -1, PREG_SPLIT_NO_EMPTY);
    print_r($matched);
    

    演示: https://3v4l.org/dAcRp

    https://regex101.com/r/5tfJGM/1/