Как я могу сопоставить запятую между каждой парой ключ: значение, ЗА ИСКЛЮЧЕНИЕМ, чтобы исключить последнее совпадение запятой? И, пожалуйста, знайте, если у вас есть более чистое регулярное выражение, так как мое кажется немного грязным. Я новичок в написании регулярных выражений.

Мне нужно, чтобы шаблон соответствовал этому формату, и они должны быть строкой карты: строка {\"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",}

0
kalbo123 4 Фев 2022 в 02:33

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]+ \\? "
 )*
 }
 $
1
sln 4 Фев 2022 в 02:53

Вместо того, чтобы закончить с

[,])+[}]$

Закончить с

(,(?!$)|}$))+$

См. демонстрацию.

Кроме того, вы можете сделать некоторое упрощение:

  • [:] идентичен просто : и т. д. для всех подобных
  • (["]|[\\]["]) идентичен \\?"
  • [a-zA-Z0-9] почти эквивалентен \w (\w также допускает подчеркивание - если это проблема, просто оставьте [a-zA-Z0-9])

Таким образом, все ваше регулярное выражение может быть преобразовано в:

^\{(\\?"\w+\\?":\\?"\w+\\?"(,(?!$)|}$))+$

Однако ваше регулярное выражение допускает несовпадающее экранирование, например

`{\"key1": "value1"}`
`{"key1": "value1\"}`

Чтобы исправить это, зафиксируйте необязательную обратную косую черту и используйте обратную ссылку на нее на другом конце, чтобы они были сбалансированы:

^\{(?:(\\?)"\w+\1":(\\?)"\w+\2?"(,(?!$)|}$))+$

См. демонстрацию (со всеми вариантами ввода).

1
Bohemian 4 Фев 2022 в 04:26
Ваше решение также позволяет разделять пары Key/Val с помощью }.
 – 
sln
4 Фев 2022 в 04:10
Да - я только что добавил текст об этом.
 – 
Bohemian
4 Фев 2022 в 04:13
Но регулярное выражение OP также допускает несоответствие экранированных и неэкранированных кавычек, поэтому уже есть пробелы
 – 
Bohemian
4 Фев 2022 в 04:14
1
Отличный пикап. Добавлено. Спасибо за обсуждение - хороший результат.
 – 
Bohemian
4 Фев 2022 в 04:31
1
Да, я думаю, я бы не хотел смешивать escaped и non escaped», или лучше.
 – 
kalbo123
4 Фев 2022 в 04:32