Одна из проблем разбора 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"];
\". – Alexander Petrov Jun 24 '20 at 08:27