正则表达式与utf8中的逗号和相等字符匹配

时间:2019-07-07 16:27:21

标签: php regex

我该如何正则表达式与此格式匹配?

a1 = q1,a2 = q2,a3 = q3,a4 = q4 (这是正确的示例,字符将为utf-8)

a1 = q1,a2 = q2,a3 = q3,a4 = q4,(错误的样本)

如果字符串的最后一个逗号是字符,如何在正则表达式中排除最后一个逗号?

我的示例php代码是:

$pattern="/^(\p{L}\=\p{L},?)*$/u";
$string1="a1=q1,a2=q2,a3=q3,a4=q4"; //correct
$string2="a1=q1,a2=q2,a3=q3,a4=q4,"; //incorrect
if (preg_match($pattern,$string1,$m)) { echo "correct"; } else { echo "incorrect"; }
if (preg_match($pattern,$string2,$m)) { echo "correct"; } else { echo "incorrect"; }

2 个答案:

答案 0 :(得分:2)

您快到了,您无需匹配任何,就可以匹配最后一组,

您可以使用

^(\p{L}+\d+\=\p{L}+\d+,)*(\p{L}+\d+\=\p{L}+\d+)$

Demo

答案 1 :(得分:1)

我的猜测是这种表达方式

(?!.*,$)([\p{L}\p{N}]+=[\p{L}\p{N}]+),?

可能在这里工作

(?!.*,$)

我们只需添加一个不以逗号结尾的语句。

该表达式在this demo的右上角进行了说明,如果您想进一步探索或修改它,在this link中,您可以逐步观察它如何与某些示例输入匹配步骤,如果您愿意的话。

测试

$re = '/(?!.*,$)([\p{L}\p{N}]+=[\p{L}\p{N}]+),?/m';
$str = 'a1=q1,a2=q2,a3=q3,a4=q4
a1=q1,a2=q2,a3=q3,a4=q4,';

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

var_dump($matches);