关于多个字符串的正则表达式帮助,

regex help about multiple string with ,

我有一个 tfa_2,tfa_3,tfa_4 的字符串,我有一个 /^tfa_\d+/

的正则表达式

如何让 select 全部 tfa_1...tfa_999 而忽略逗号?

谢谢。

根据更新和评论,

/(tfa_\d{1,3})+/g

在PHP中:

$re = "/(tfa_\d{1,3})+/"; 
$str = "tfa_1,tfa_002,tfa_999,tfa_xxx"; 

preg_match_all($re, $str, $matches);

将匹配 tfa_1tfa_002tfa_999 但不匹配 tfa_xxxtfa_

假设输入包含准确的格式 ^tfa_\d+(,tfa_\d+)*$tfa_

之后的数字没有限制

最简单的解决方案是使用 explode:

$tokens = explode(",", "tfa_2,tfa_3,tfa_4");

您也可以使用 preg_splitpreg_match,但在这种假设下它们太过分了:

$tokens = preg_split('/,/', "tfa_2,tfa_3,tfa_4");
$retcode = preg_match_all('/tfa_\d+/', "tfa_2,tfa_3,tfa_4", $tokens);

假设输入包含确切的格式 ^[^,]+(,[^,]+)*$,没有引号标记,并且 tfa_

之后的数量没有限制

您需要声明 tfa_\d+ 之前或之后没有非分隔符(非逗号字符)以防止 htfa_345tfa_456xxx-tfa_34从被视为匹配:

$retcode = preg_match_all('/(?<![^,])tfa_\d+(?![^,])/', "tfa_2,tfa_3,tfa_4,htfa_345,tfa_456xxx,-tfa_34", $tokens);

替代方案,通过 explode 沿 , 的字符串并使用 array_filter 过滤掉不需要的字段:

$fields = explode(",", "tfa_2,tfa_3,tfa_4,htfa_345,tfa_456xxx,-tfa_34");
$tokens = array_filter($fields, function ($v) {
    return preg_match('/^tfa_\d+$/', $v) == 1;
});

假设输入包含精确格式^[^,]+(,[^,]+)*$,没有引号,并且tfa_后面的数字只能是1到999

稍微修改正则表达式以限制数量([1-9]\d{0,2}):

$retcode = preg_match_all('/(?<![^,])tfa_[1-9]\d{0,2}(?![^,])/', "tfa_2,tfa_3,tfa_4456,htfa_345,tfa_456xxx,-tfa_34", $tokens);

类似修改explode+array_filter解决方案:

$fields = explode(",", "tfa_2,tfa_3,tfa_4456,htfa_345,tfa_456xxx,-tfa_34");
$tokens = array_filter($fields, function ($v) {
    return preg_match('/^tfa_[1-9]\d{0,2}$/', $v) == 1;
});