关于多个字符串的正则表达式帮助,
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_1
、tfa_002
、tfa_999
但不匹配 tfa_xxx
或 tfa_
假设输入包含准确的格式 ^tfa_\d+(,tfa_\d+)*$
且 tfa_
之后的数字没有限制
最简单的解决方案是使用 explode
:
$tokens = explode(",", "tfa_2,tfa_3,tfa_4");
您也可以使用 preg_split
或 preg_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_345
、tfa_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;
});
我有一个 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_1
、tfa_002
、tfa_999
但不匹配 tfa_xxx
或 tfa_
假设输入包含准确的格式 ^tfa_\d+(,tfa_\d+)*$
且 tfa_
之后的数字没有限制
最简单的解决方案是使用 explode
:
$tokens = explode(",", "tfa_2,tfa_3,tfa_4");
您也可以使用 preg_split
或 preg_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_345
、tfa_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;
});