我有一个像
这样的文本片段;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替换所有片段。
答案 0 :(得分:1)
如果您尝试仅匹配=
之后和换行符之前的数字
要获得更准确的匹配,请使用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
)字符终止。