Regex для сравнения с запятой и равными символами в utf8 - PullRequest
1 голос
/ 07 июля 2019

Как я могу сопоставить регулярное выражение с этим форматом?

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 ]

2 голосов
/ 07 июля 2019

Вы почти там, все, что вам нужно, чтобы соответствовать последней группе без ,,

Вы можете использовать это

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

Демо

1 голос
/ 07 июля 2019

Я предполагаю, что это выражение

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

может работать, и здесь

(?!.*,$)

мы бы просто добавили оператор, не заканчивающийся запятой.

Выражение объяснено на верхней правой панели этой демонстрации , если вы хотите изучить ее или изменить ее, а в этой ссылке вы можете посмотреть, какесли хотите, он будет соответствовать пошаговым вводам некоторых примеров.

Test

$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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...