0
"currencies":{
   "EUR":{
   "ask":"30.0000",
   "bid":"29.5000"
 },
   "RUB":{
   "ask":"0.3860",
   "bid":"0.3680"
 },
 "USD":{
   "ask":"26.7400",
   "bid":"26.5600"
 }
} 

Нужно создать регулярку для получения данных Bid из USA. Код моей регулярки

"USD":{"...":".*?","...":"(.*?)"

Не работает. Поможете с написанием ее ? В чем ошибка ?

titov
  • 33
  • 1
    Это вы должны сказать, какая у вас ошибка. Судя по всему, даже не компилируется? Символы кавычки в строковом литерале нужно экранировать: \". – Alexander Petrov Jun 24 '20 at 08:27
  • 1
    Возьмите json-парсер и не мучайтесь. Благо этих парсеров имеется несколько штук. Какой именно взять, зависит от платформы, под которую вы пишете. Укажите её и получите точный совет. – Alexander Petrov Jun 24 '20 at 08:28
  • 3
    JSON формат ни кто руками не парсит, для этого существуют десятки библиотек, от банальной серриализации, до обычного конвертирования. – Дмитрий Гвоздь Jun 24 '20 at 08:28
  • MatchCollection matchUSDBid = Regex.Matches(json, @"""USD"":{""..."":"".?"",""..."":""(.?)""}"""); – titov Jun 24 '20 at 08:28
  • 5
    Регулярные выражения предназначены для разбора регулярных грамматик. Грамматика json является нерегулярной. Поэтому откажитесь от регексов и юзайте парсер. – Alexander Petrov Jun 24 '20 at 08:29
  • Подскажите, какой-то не сложный ) Я раньше не занимался парсингом – titov Jun 24 '20 at 08:30
  • 1
    System.Text.Json или Newtonsoft.Json. Могу оформить ответ с примером разобра. С одним из них. – bearpro Jun 24 '20 at 08:39
  • Было бы очень кстати, если бы был пример – titov Jun 24 '20 at 08:45
  • Укажите платформу, которую вы используете. Обычный .NET Framework или .NET Core? И точную версию в любом случае. – Alexander Petrov Jun 24 '20 at 09:27
  • .NET framework последнюю версию – titov Jun 24 '20 at 10:22

1 Answers1

1

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

string json = ...;
json = Regex.Replace(json, @"\s+", "");
var pattern = "\"USD\":{\"ask\":\".*?\",\"bid\":\"(.*?)\"}";
var match = Regex.Match(json, pattern);
var bid = match.Groups[1].Value;

Показанный вами код является невалидным JSON. Нужны по крайней мере ещё одни фигурные скобки. Допустим, они есть.

Вместо регулярок лучше применить какой-нибудь парсер JSON.

Например, популярную библиотеку Newtonsoft.Json. Устанавливаем её из nuget. Открываем пространство имён

using Newtonsoft.Json.Linq;

Далее достаточно следующего минимального кода:

JObject jObject = JObject.Parse(json);
var bid = jObject["currencies"]["USD"]["bid"];

Если не хочется тянуть в проект лишнюю зависимость в виде библиотеки, то можно использовать родной сериализатор дотнета - класс JavaScriptSerializer. Для этого достаточно подключить сборку System.Web.Extensions.dll.
Открываем пространство имён

using System.Web.Script.Serialization;

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

var jss = new JavaScriptSerializer();

var jObject = (Dictionary<string, object>)jss.DeserializeObject(json); var currencies = (Dictionary<string, object>)jObject["currencies"]; var usd = (Dictionary<string, object>)currencies["USD"];

var bid = usd["bid"];