Как я могу сопоставить запятую между каждой парой ключ: значение, ЗА ИСКЛЮЧЕНИЕМ, чтобы исключить последнее совпадение запятой? И, пожалуйста, знайте, если у вас есть более чистое регулярное выражение, так как мое кажется немного грязным. Я новичок в написании регулярных выражений.
Мне нужно, чтобы шаблон соответствовал этому формату, и они должны быть строкой карты: строка {\"key1\":\"val1\",....N} или {"key1":"val1",....N }
Примере
{\"key1\":\"val1\",\"key2\":\"val2\",\"k3\":\"v3\",\"k4\":\"v4\"}
Что у меня есть для моего регулярного выражения:
^[{]((["]|[\\]["])[a-zA-Z0-9]+(["]|[\\]["])[:](["]|[\\]["])[a-zA-Z0-9]+(["]|[\\]["])[,])+[}]$
Какой мой матч - я не хочу последнюю запятую: {"key1":"val1","key2":"val2","k3":"v3","k4":"v4",}
2 ответа
Обычно это делается путем запроса первой пары Key/Val, а затем создания всех остальных
необязательно с добавленным разделителем ,
^{\\?"[a-zA-Z0-9]+\\?":\\?"[a-zA-Z0-9]+\\?"(?:,\\?"[a-zA-Z0-9]+\\?":\\?"[a-zA-Z0-9]+\\?")*}$
https://regex101.com/r/cqJk8q/1
^
{
\\? " [a-zA-Z0-9]+ \\? ": \\? " [a-zA-Z0-9]+ \\? "
(?:
, \\? " [a-zA-Z0-9]+ \\? ": \\? " [a-zA-Z0-9]+ \\? "
)*
}
$
Вместо того, чтобы закончить с
[,])+[}]$
Закончить с
(,(?!$)|}$))+$
См. демонстрацию.
Кроме того, вы можете сделать некоторое упрощение:
[:]
идентичен просто:
и т. д. для всех подобных(["]|[\\]["])
идентичен\\?"
[a-zA-Z0-9]
почти эквивалентен\w
(\w
также допускает подчеркивание - если это проблема, просто оставьте[a-zA-Z0-9]
)
Таким образом, все ваше регулярное выражение может быть преобразовано в:
^\{(\\?"\w+\\?":\\?"\w+\\?"(,(?!$)|}$))+$
Однако ваше регулярное выражение допускает несовпадающее экранирование, например
`{\"key1": "value1"}`
`{"key1": "value1\"}`
Чтобы исправить это, зафиксируйте необязательную обратную косую черту и используйте обратную ссылку на нее на другом конце, чтобы они были сбалансированы:
^\{(?:(\\?)"\w+\1":(\\?)"\w+\2?"(,(?!$)|}$))+$
См. демонстрацию (со всеми вариантами ввода).
Новые вопросы
json
JSON (объектная нотация JavaScript) - это сериализуемый формат обмена данными, предназначенный для машинного и человеческого чтения. Не используйте этот тег для собственных объектов JavaScript или литералов объектов JavaScript. Прежде чем задать вопрос, проверьте свой JSON с помощью валидатора JSON, такого как JSONLint (https://jsonlint.com).
}
.