Соответствие регулярному выражению узла json

1

Мне нужно извлечь одно значение узла внутри определенного узла в длинной строке 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, это регулярное выражение может не соответствовать моей ситуации.
Есть идеи?

  • 1
    Должно быть проще (и, возможно, быстрее) просто проанализировать JSON и получить нужные значения. Ссылка в System.Web.Helpers.Json
  • 0
    Что происходит, когда в описании есть кавычки типа "description":"example \"blah\""
Показать ещё 6 комментариев
Теги:

1 ответ

1
Лучший ответ

Это регулярное выражение должно работать для вашего случая и должно быть быстрее:

"person"\s*:\s*\{(?:
  (?(open)(?!)|(?>"description"\s*:\s*"(?<description>(?:\\.|(?>[^\\"]+))*)"))
  |(?>[^{}"]+)
  |(?>(?:"(?:\\.|(?>[^\\"]+))*"))
  |(?<open>\{)
  |(?<-open>\})
)*?
(?(open)(?!))
(?(description)|(?!))

DEMO

Используйте его с IgnorePatternWhitespace. Он также будет правильно обрабатывать экранированные кавычки (\"). Ваше описание будет описано в description именем group.

Это должно быть быстрее, потому что я использовал атомные группы ((?>...)) в нескольких местах, где я знаю, что обратное отслеживание бесполезно, а также я прекратил сканирование текста, как только он находит нужное ему описание.

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

var regex = new Regex(@".....")
  • 0
    Это не улавливает свойства "за" листом job , в примере OP "sex":"male" .
  • 0
    В моем понимании @funkwurm, запрашивающему нужен только узел description , поэтому мое регулярное выражение останавливается, как только оно его захватывает.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню