Прежде чем я попрошу об этом, я просто хочу сказать, что у меня нет прежнего опыта регулярного выражения, но у меня есть идея, что они делают/могут выполнить.
У меня есть HTTP POST, входящий в мой скрипт, который будет выглядеть примерно так:
tagId = "123(COMMENT),456(COMMENT),6782(COMMENT)"
где числа всегда будут tag_ids
а (COMMENT)
будут просто комментариями для людей, то есть не требуемыми скриптом.
Мне нужно только числовые значения, поэтому мой первоначальный план состоял в том, чтобы взорвать переменную в запятых, а затем пропустить каждый из элементов в этом массиве и просто найти подстроку до первой "(" Но это кажется очень неуклюжим способом " делать вещи.
Мне интересно, есть ли способ использовать регулярное выражение для синтаксического анализа чисел в гораздо более чистом виде, чем мое первоначальное мышление.
Любые советы или просто указатели на полезные документы были бы замечательными, потому что, как я уже сказал, я их когда-то не использовал.
Здесь работает регулярное выражение:
\(.*?\)(*SKIP)(?!)|\d+
Он будет соответствовать всем номерам за пределами круглых скобок. Предполагается, что вы не можете вставить скобки.
Он работает, сопоставляя скобки и их содержимое, и отбрасывая их, или число (которое затем будет снаружи).
Вы можете превратить его в строку JSON
$tagID = '123(COMMENT123),456(COMMENT456),6782(COMMENT6782)';
preg_match_all('/(\d+)\((.+?)\)/i', $tagID, $matches);
$result = "";
for ($i = 0; $i < count($matches[1]); $i++) {
$toAdd = '{"tagID":' . $matches[1][$i] . ',"comment":"' . $matches[2][$i] . '"},';
$result .= $toAdd;
}
$result = substr($result, 0, strlen($result) - 1);
$result = '[' . $result . ']';
echo $result;
Вы можете использовать регулярное выражение
\b\d+\b
для сопоставления чисел в tagId
пример соответствия http://regex101.com/r/xU9aN5/1
ИЛИ
(?<!\()\b\d+\b(?!\))
если комментарий может содержать цифры типа 123(456),789(foo)
123(456),789(foo)
?
Вот моя попытка:
/(\d+)(?:\([^)]*\))?(?:,|$)/g
Он работает точно так же, как вы предполагали, предполагая, что комментарии не могут быть вложенными и что формат всегда один и тот же.
Вы можете проверить здесь рабочую версию: http://regex101.com/r/rS9sE7/2
Спасибо @LucasTrzesniewsk за то, что я заметил ошибку.
?
вот так: (\d+)(?:\([^)]*\))?(?:,|$)
Поскольку для проблемы существует не только одно решение, я представлю еще один ответ.
Это, безусловно, самое простое регулярное выражение, которое вы можете использовать для этого:
/(?:^|,)(\d+)/g
Он будет соответствовать номерам сразу после начала строки или сразу после комы (char ,
).
Вы можете проверить это здесь: http://regex101.com/r/jA5tC3/2
(*SKIP)
это было что-то новое для меня. так что же это на самом деле?