0

我有以下字符串:

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
        )

)
4

2 回答 2

2

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

"/^(\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"
}
于 2013-10-19T16:05:01.397 回答
1

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

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

这个怎么运作

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

  3. .)-- 允许g匹配。

于 2013-10-19T16:11:50.403 回答