сопоставьте данные с регулярным выражением и, если возможно, обратным просмотром вперед - PullRequest
0 голосов
/ 10 июля 2020

У меня есть эта куча данных:

{"data":[12,23,34,45,56,67,78,89,90,10], "something": {"key":"value"}}

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

12,23,34,45,56,67,78,89,90,10

возможно ли это сделать с помощью регулярного выражения обратного просмотра вперед? или что мне следует использовать для достижения результата?

Я пытаюсь сделать следующее, но это не работает: (?!\d{2},).*

спасибо за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 10 июля 2020

Проблема с:

(?!\d{2},).*

В том, что как только он находит позицию, в которой следующие символы не исправляются, \d{2}, так, что утверждение отрицательного просмотра вперед завершается успешно, тогда .* соответствует остальной части input, и вы в конечном итоге замените всю строку, предположительно, на ''.

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

(?!\d{2},).

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

... [1 2,3 ....
      ^
current position between the 1 and the 2

Проблема теперь в том, что утверждение отрицательного просмотра вперед успешно, потому что нет два цифр, но только одна di git следующая, поэтому 2 будет заменен. Итак, если вы собираетесь использовать свою методологию, вам придется ослабить утверждение отрицательного просмотра вперед до:

(?!,?\d{1,2},?).

In Python:

>>> re.sub(r'(?!,?\d{1,2},?).', '', '{"data":[12,23,34,45,56,67,78,89,90,10], "something": {"key":"value"}}')
'12,23,34,45,56,67,78,89,90,10'

Но пока регулярное выражение работает для этого Speci c input, он был вынужден ослабить утверждение до такой степени, что оно также могло бы принимать одинарные git числа:

>>> re.sub(r'(?!,?\d{1,2},?).', '', '{"data":[1,3,4,5,6,7,8,9,0,0], "something": {"key":"value"}}')
'1,3,4,5,6,7,8,9,0,0'

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

>>> re.findall(r'(?<=\[)\d{2}(?:,\d{2})*(?=])', '{"data":[12,23,34,45,56,67,78,89,90,10], "something": {"key":"value"}}')
['12,23,34,45,56,67,78,89,90,10']

В Python функция findall возвращает список всех найденных совпадений (в этом случае длина списка равна единице).

0 голосов
/ 10 июля 2020

Вы должны обязательно использовать здесь библиотеку синтаксического анализа JSON, например GSON, если это вообще возможно.

String json = "{\"data\":[12,23,34,45,56,67,78,89,90,10], \"something\": {\"key\":\"value\"}}";
JsonParser parser = new JsonParser();
JsonObject rootObj = parser.parse(json).getAsJsonObject();
JsonArray dataArr = rootObj.getAsJsonArray("data");
System.out.println(dataArr);

Если по какой-то причине вы действительно не можете сделать что-то вроде приведенного выше, то вот однострочный, который должен работать для вашей входной строки:

String input = "{\"data\":[12,23,34,45,56,67,78,89,90,10], \"something\": {\"key\":\"value\"}}";
String nums = input.replaceAll(".*\"data\":\\[(.*?)\\].*", "$1");
System.out.println(nums);

Это печатает:

12,23,34,45,56,67,78,89,90,10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...