使用正则表达式

时间:2017-09-25 14:02:18

标签: php regex string pattern-matching

我尝试使用以下示例删除与特定模式不匹配的字符:

模式恰好匹配4个字母[a-zA-Z]{4},后跟空格\s{1,},然后是4个字母,以字母开头,最后3个数字[a-zA-Z]{1}[0-9]{3}

如果我提供ABEH A501; BIOL L340; BIOL Z620; Q799; ABEH A501,则匹配除Q799以外的所有内容,现在,我需要从字符串中删除/替换Q799

我尝试应用Negated Character Classes,但仍未获得所需的结果。

$mystring = "ABEH A501; BIOL L340; BIOL Z620; Q799; ABEH A501";
$string = preg_replace("/[^a-zA-Z]{4}\s{1,}[a-zA-Z]{1}[0-9]{3}/","",$mystring);

echo $string; //ABEH A501; BIOL L340; BIOL Z; ABEH A501

所需的结果应为ABEH A501; BIOL L340; BIOL Z620; ABEH A501

Q799已删除,因此也是另一个匹配字符串的一部分,不确定这是由于错误的regEx还是错误的应用否定字符类。

2 个答案:

答案 0 :(得分:3)

在PHP中,您可以定义一个已知的匹配正则表达式,并使用PCRE动词(*SKIP)(*F)来替换这些匹配项:

$mystring = "ABEH A501; BIOL L340; BIOL Z620; Q799; ABEH A501";
echo preg_replace('/[a-zA-Z]{4}\s+[a-zA-Z]\d{3}(*SKIP)(*F)|\w+\W*/', '', $mystring);

RegEx Demo

<强>输出:

ABEH A501; BIOL L340; BIOL Z620; ABEH A501

PHP Code Demo

答案 1 :(得分:1)

这是一个与问题不同的方法,但嘿,它有效

<?php

$mystring = "ABEH A501; BIOL L340; BIOL Z620; Q799; ABEH A501";
preg_match_all("/[a-zA-Z]{4}\s{1,}[a-zA-Z]{1}[0-9]{3};?\s+?/",$mystring, $matches);
$result = "";
foreach($matches[0] as $match) {
    $result = $result.$match;
}
echo $result; //ABEH A501; BIOL L340; BIOL Z620; 

?>