Захватить вторую строку в кавычках без завершающей кавычки / разделителя - PullRequest
0 голосов
/ 12 апреля 2019

Новый ученик регулярных выражений здесь, у меня есть строка, которая надежно состоит из двух строк в кавычках, разделенных двоеточием, например:

"foo": "bar"

Я пытаюсь извлечь только "bar" без кавычек

Я придумал это:

\:([^"]*"){2}

, что дает мне: bar" во втором матче, но я изо всех сил пытаюсь найти способ устранить завершающую цитату.

Любая помощь очень ценится!

Ответы [ 4 ]

3 голосов
/ 12 апреля 2019

Вы можете использовать упреждающий просмотр, чтобы проверить, что следующая двойная кавычка также является последним символом во вводе:

[^"]*(?="$)

2 голосов
/ 12 апреля 2019

Ваш лучший подход зависит от вида используемого вами регулярного выражения. Существуют некоторые приемы, которые позволяют вам соответствовать только фигуре, которую вы хотите.

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

"[^"]+"\s*:\s*"([^"]+)(?=")

Демо

Если вы уверены, что у вас не будет любой строки другого типа и что строка будет заканчиваться сразу после последней кавычки, тогда ответ trincot будет проще и лучше.

0 голосов
/ 13 апреля 2019

Мне легко запомнить этот шаблон, используя \K (не допускать совпадения с регулярным выражением) :

\s"\K.+(?=")

Его можно прочитать как:

  • Игнорировать все влево до пробела и "\s"\K (удалить "foo": ")

  • Затем получить все, пока не будет найден первый " 1018*, поэтому ti вернет только bar

Проблема с этим подходом заключается в том, что вам всегда нужно иметь одинаковый ввод / шаблон элементов, если у вас есть что-то большее, не будет работатьНапример:

"bla": "foo": "bar"

Вернет:

foo": "bar

@ trincot answer [^"]*(?="$) гарантирует всегда заключать последний элемент в "", так что вы можете иметь "bla": "foo": "bar" и всегда получайте bar

@ ed-cottrell ответов "[^"]+"\s*:\s*"([^"]+)(?=") получит второе, независимо от длины

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

"([^"]*)"

и затем с вашим программированием выбора получите желаемую группу

0 голосов
/ 12 апреля 2019

Проверьте это

echo '"foo":"bar"' | awk -F':' '{gsub(/"/, "", $2); print $2}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...