我怎样才能匹配第一行?

时间:2016-06-07 21:34:07

标签: php regex

我有这个字符串:

$str = "11ff11
        22mm22
        33gg33
        mm22mm
        vv55vv
        77ll77
        55kk55
        kk22kk
        bb11bb";

有两种模式:

  1. {two numbers}{two letters}{two numbers}
  2. {two letters}{two numbers}{two letters}
  3. 我正在尝试在模式更改时匹配第一行。所以我想匹配这些:

    11ff11  -- this
    22mm22
    33gg33
    mm22mm  -- this
    vv55vv
    77ll77  -- this
    55kk55
    kk22kk  -- this
    bb11bb
    

    这是我的current pattern

    /(\d{2}[a-z]{2}\d{2})|([a-z]{2}\d{2}[a-z]{2})/
    

    但它匹配所有线......如何将其限制为仅匹配相同模式的第一行?

3 个答案:

答案 0 :(得分:2)

不确定是否只能使用一个表达式执行此操作,但您可以迭代字符串并在更改时进行测试:

<?php

$str = "11ff11
        22mm22
        33gg33
        mm22mm
        vv55vv
        77ll77
        55kk55
        kk22kk
        bb11bb";

$exploded = explode(PHP_EOL, $str);
$patternA = '/(\d{2}[a-z]{2}\d{2})/';
$patternB = '/([a-z]{2}\d{2}[a-z]{2})/';

$result = [];
$currentPattern = '';

//get first and check what pattern is
if(preg_match($patternA, $exploded[0])){
    $currentPattern = $patternA;
    $result[] = $exploded[0];
} elseif(preg_match($patternB, $exploded[0])){
    $currentPattern = $patternB;
    $result[] = $exploded[0];
} else {
    //.. no pattern on first element, should we continue?
}

//toggle
$currentPattern = $currentPattern == $patternA ? $patternB : $patternA;

foreach($exploded as $e) {
    if(preg_match($currentPattern, $e)) {
        //toggle
        $currentPattern = $currentPattern == $patternA ? $patternB : $patternA;
        $result[] = trim($e);
    }
}
echo "<pre>";
var_dump($result);
echo "</pre>";

输出:

array(4) {
  [0]=>
  string(6) "11ff11"
  [1]=>
  string(6) "mm22mm"
  [2]=>
  string(6) "77ll77"
  [3]=>
  string(6) "kk22kk"
}

答案 1 :(得分:2)

由于空格问题,我无法通过环视来完成。但是有了经典的正则表达式,它是可用的。它找到了重复模式的序列,只捕获了第一个

<ion-slide>

demo and some explanation

为了理解它是如何工作的,我用数字和字母的模式制作了简单的例子:

(?:(\d{2}[a-z]{2}\d{2})\s+)(?:\d{2}[a-z]{2}\d{2}\s+)*|(?:([a-z]{2}\d{2}[a-z]{2})\s+)(?:[a-z]{2}\d{2}[a-z]{2}\s+)*

demo and some explanation

答案 2 :(得分:1)

这是我的看法。从来没有使用过lookbehinds,我的正则表达式技巧不是很好,但这似乎回归你想要的。

/^.*|(?<=[a-z]{2}\n)\d{2}[a-z]{2}\d{2}|(?<=\d{2}\n)[a-z]{2}\d{2}[a-z]{2}/