(可选)防止匹配通配符末尾的字符串

时间:2013-10-19 16:02:01

标签: regex

我有以下字符串:

12345 This could be anythingREMOVE

我需要匹配12345This could be anything。不幸的是,我需要解析的格式在行尾也有一个字符串,并不总是存在(在本例中为REMOVE)。如何在没有REMOVE的情况下匹配我正在寻找的内容?我尝试过以下模式:

^(\d{5}) (.*)(?:REMOVE|$)

不幸的是,REMOVE被通配符接收:

(
    [0] => Array
        (
            [0] => 12345 This could be anythingREMOVE
        )

    [1] => Array
        (
            [0] => 12345
        )

    [2] => Array
        (
            [0] => This could be anythingREMOVE
        )

)

2 个答案:

答案 0 :(得分:2)

如果最后一个字符串REMOVE是可选的,那么为什么不能使用htis regex:

"/^(\d{5}) /"

但是,如果你真的想在匹配模式中避免使用REMOVE,那么请使用:

$s = '12345 This could be anythingREMOVE';
if (preg_match("/^(\d{5}) (.*?)(?:REMOVE|)$/", $s, $arr))
   var_dump($arr);

输出:

array(3) {
  [0]=>
  string(34) "12345 This could be anythingREMOVE"
  [1]=>
  string(5) "12345"
  [2]=>
  string(22) "This could be anything"
}

答案 1 :(得分:1)

你可以试试这个正则表达式:

^(\d{5})((?:.(?!REMOVE))+.)

如何运作

  1. ^(\d{5}) - 匹配字符串的开头,后跟五位数[0-9]。一组括号用于捕获匹配的文本。
  2. ((?:.(?!REMOVE))+ - 匹配任何字符,如果没有紧跟一个或多个secuence REMOVE。它停在n的{​​{1}}。 anything匹配,因为后跟g

  3. REMOVE - 允许.)匹配。