Синтаксический анализ массива с использованием регулярных выражений в JavaScript - PullRequest
0 голосов
/ 20 февраля 2019

Я нашел ответ для этого здесь , но это в php.

Я бы хотел сопоставить массив как [123, "hehe", "lala"], но только если синтаксис массива правильный.

Я сделал это регулярное выражение /\["?.+"?(?:,"?.+"?)*\]/.

Проблема в том, что если входное значение равно [123, "hehe, "lala"], регулярное выражение совпадает, но синтаксис неверен.

Как можноЯ делаю это только если синтаксис массива правильный?

Моя проблема заключается в том, что второй " требуется, когда сопоставляется первый ".

Редактировать: я пытаюсь делать это только со строками и числами внутри массива.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Вы можете попробовать это регулярное выражение: /\[((\d+|"([^"]|\\")*?")\s*,?\s*)*(?<!,)\]/

Каждый элемент должен либо

"([^"]|\\")*?": начинаться и заканчиваться на ", содержащий все, кроме".Если "содержится, его следует экранировать (\").

\d+: число

После каждого элемента должно быть

\s*,?\s*: запятая с любымколичество пробелов до или после.

И перед закрывающей скобкой не должно быть запятой: (?<!,)

Демо: https://regex101.com/r/jRAQUc/1

0 голосов
/ 20 февраля 2019

Для этого необходимо иметь два (или более) отдельных выражения (используя оператор |).

Так что это будет примерно так:

/\[\s*("[^"]*"|[0-9]+)(\s*,\s*("[^"]*"|[0-9]+))*\s*\]/

(Вы также можете использовать ^ в начале и $ в конце, чтобы убедиться, что ничего больше не появляется перед / после массива: /^...snip...$/, чтобы соответствовать строке от начала до конца.)

Если вам нужны числа с плавающей запятой с показателями степени, добавьте точку и символ 'e': [0-9.eE]+ (именно поэтому я не использовал \d+, потому что в этом случае разрешены только цифры).Чтобы убедиться, что число допустимо, оно намного сложнее, очевидно (знак, экспонента со знаком / без знака, цифры только до или после десятичной запятой ...)

Вы также можете поддерживать строки в одинарных кавычках.Это тоже отдельное выражение: '[^']*'.

Возможно, вы также захотите разрешить пробелы до и после скобок (начало: /^\s*\[... и конец: ...\]\s*$/).

НаконецЕсли вы хотите действительно поддерживать строки JavaScript, вам нужно добавить поддержку обратной косой черты.Примерно так: ("([^"]|\\.)*").

Примечание

Ваше выражение .+ будет соответствовать " и , тоже, без ^ и $ массив как следует соответствует вашему выражению просто отлично:

This Array ["test", 123, true, "this"] Here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...