Мне нужно извлечь одно значение узла внутри определенного узла в длинной строке JSON.
т.е. узел описания узла пользователя:
" person ": {"age": "10", " description ": "example", job: {"title": "sales", "pay": "$ 3000"}, "sex": "male"}
Поскольку использование JSON-библиотеки для десериализации длинной строки JSON тратилось слишком много времени, я googled и нашел регулярное выражение, чтобы соответствовать одному значению узла JSON, и он работает быстро большую часть времени (за несколько мс)
Regex regex = new Regex("\"person\":{(?:[^{}]|(?<open>{)|(?<-open>}))*\"description\":\"(.*?)\"(?:.*?)(?(open)(?!))}");
Он работает медленно (используя полную секунду), когда дублированное имя узла существует в каком-либо внутреннем узле после того, как совпадение произошло по неизвестной причине:
"person": {"age": "10", " description ": "example", job: {"title": "sales", "pay": "$ 3000", " description ": "example"} секс ":" мужчина "}
Я хочу улучшить эффективность этого регулярного выражения, чтобы он проверял только внешний контент для узла пользователя (полужирный):
"человек": { "возраст": "10", "Описание": "пример", работа: { "название": "продажа", "зарплата": "$ 3000", "Описание": "пример"}, " секс ":" мужчина " }
Я новичок в regex, это регулярное выражение может не соответствовать моей ситуации.
Есть идеи?
Это регулярное выражение должно работать для вашего случая и должно быть быстрее:
"person"\s*:\s*\{(?:
(?(open)(?!)|(?>"description"\s*:\s*"(?<description>(?:\\.|(?>[^\\"]+))*)"))
|(?>[^{}"]+)
|(?>(?:"(?:\\.|(?>[^\\"]+))*"))
|(?<open>\{)
|(?<-open>\})
)*?
(?(open)(?!))
(?(description)|(?!))
Используйте его с IgnorePatternWhitespace
. Он также будет правильно обрабатывать экранированные кавычки (\"
). Ваше описание будет описано в description
именем group.
Это должно быть быстрее, потому что я использовал атомные группы ((?>...)
) в нескольких местах, где я знаю, что обратное отслеживание бесполезно, а также я прекратил сканирование текста, как только он находит нужное ему описание.
О, и вы должны использовать дословные строки для регулярных выражений, чтобы вам не приходилось избегать всего:
var regex = new Regex(@".....")
job
, в примере OP "sex":"male"
.
description
, поэтому мое регулярное выражение останавливается, как только оно его захватывает.
"description":"example \"blah\""