preg_replace问题。其他字符类中的字符类

时间:2014-12-24 05:18:42

标签: php regex

我有一个像

这样的文本片段
;flat
CID_999999 = 99999999
CID_999999 = 99999999
CID_999999 = 99999999
CID_999999 = 99999999

其中999999是一些数字。我想通过regexp找到这个片段。 当我使用这个正则表达式时:

preg_replace('/;flat[\s\r\n]+[CID_0-9]+\s=\s[0-9]+\n/','REPLACEMENT',$content);

它取代了;flat和第一个CID字符串。 所以,我想如果我将[CID_0-9]+\s=\s[0-9]+\n部分放在字符类[]+中,它将删除所有CID字符串。但是,如果我这样做,它不会取代任何东西。所以我不懂正则表达式中的东西。我究竟做错了什么? 我认为预期的输出很明显,但还可以。我应该用REPLACEMENT替换所有片段。

3 个答案:

答案 0 :(得分:1)

  1. 如果您尝试仅匹配=之后和换行符之前的数字

  2. ,请使用lookbehind
  3. 要获得更准确的匹配,请使用CID[0-9]+而不是[CID0-9]+

    preg_replace('/(?<;flat[\s\r\n]+CID_[0-9]+\s=\s)[0-9]+(?=\n)/','REPLACEMENT',$content);
    

答案 1 :(得分:0)

;flat\s*|(?!^)\G(CID_\d+\s*=\s*\d+\s*)

试试这个。$1。见。演示。

https://regex101.com/r/gQ3kS4/7

$re = "/;flat\\s*|(?!^)\\G(CID_\\d+\\s*=\\s*\\d+\\s*)/";
$str = ";flat\nCID_999999 = 99999999\nCID_999999 = 99999999\nCID_999999 = 99999999\nCID_999999 = 99999999\n;";
$subst = "$1";

$result = preg_replace($re, $subst, $str);

答案 2 :(得分:0)

你不需要一个角色类([...]);你需要一个小组((...))。您的代码应如下所示:

preg_replace('/;flat[\s\r\n]+([CID_0-9]+\s=\s[0-9]+\n?)+/', 'REPLACEMENT', $content);

请注意最后的?,以防万一您的最后一行未以新行(\n)字符终止。

Demo