Регулярное выражение, чтобы соответствовать последнему значению в данных - PullRequest
0 голосов
/ 05 июня 2018

Я получаю данные из URL-адреса и работаю над данными, чтобы проверить некоторые условия.Данные из URL выглядят так:

1528190345":100,"1528190346":100,"1528190368":100,"1528190414":100,"1528190439":99,"1528190440":99,"1528190463":100,"1528190485":100,"1528190508":100,"1528190550":100,"1528190575":100,"1528190576":100,"1528190599":100,"1528190600":100,"1528190622":100,"1528190667":100,"1528190688":100,"1528190689":100,"1528190712":100,"1528190736":100,"1528190762":100,"1528190785":100,"1528190786":100,"1528190807":100,"1528190828":100,"1528190853":100,"1528190877":100,"1528190901":100,"1528190925":100,"1528190948":100,"1528190968":100,"1528190991":100}}]

====

Я тоже преобразовал это в JSON

{"metric"=> "Insta_real-unique_value", "tags" => {"host" => "letme.quickly.com", "tier" => "2", "device" => "tester1", "dc" =>"xxx"}, "aggregateTags" => ["имя_устройства", "device_ip"], "dps" => {"1526972408" => 100, "1526972424" => 100, "1526972440" => 100, "1526972456"=> 100, "1526972472" => 100, "1526972488" => 100, "1526972504" => 100, "1526972520" => 100, "1526972536" => 100, "1526972552" => 100, "1526972568" => 100, "1526972569" => 100, "1526972584" => 100, "1526972585" => 100, "1526972601" => 100, "1526972617" => 100, "1526972633" => 100, "1526972649" =>100, "1526972665" => 100, "1526972681" => 100}}

Я хочу извлечь значение, соответствующее 100. Когда я делаю это:

url = "#{URL}"
uri = URI(url)
response = Net::HTTP.get(uri)
value = response[-6..-4]
puts value

Я получаюпоследнее значение, но когда последнее значение изменяется на 99/9/0, оно печатает :99 или ":9.

Есть ли способ получить точное значение как есть?

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

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

В этом случае мы можем сделать:

JSON.parse(response)['dps'].values.last #=> 100
0 голосов
/ 05 июня 2018

Если ответ является ответом json, вы должны использовать анализатор json, иначе, если это не ответ json, вы можете использовать выражение regex с объектом Regex.

В случае jsonответ, предполагая, что объект является чем-то вроде объявленного в переменной ответа следующего кода, вы можете проанализировать его в JObject.(используя Newtonsoft.Json, доступный в репозитории nuget).

См. следующий пример:

string response = "[{\"response\":{\"1528190345\":100,\"1528190346\":100,\"1528190368\":100,\"1528190414\":100,\"1528190439\":99,\"1528190440\":99,\"1528190463\":100,\"1528190485\":100,\"1528190508\":100,\"1528190550\":100,\"1528190575\":100,\"1528190576\":100,\"1528190599\":100,\"1528190600\":100,\"1528190622\":100,\"1528190667\":100,\"1528190688\":100,\"1528190689\":100,\"1528190712\":100,\"1528190736\":100,\"1528190762\":100,\"1528190785\":100,\"1528190786\":100,\"1528190807\":100,\"1528190828\":100,\"1528190853\":100,\"1528190877\":100,\"1528190901\":100,\"1528190925\":100,\"1528190948\":100,\"1528190968\":100,\"1528190991\":100}}]";

List<Dictionary<string, Dictionary<string, int>>> values = JsonConvert.DeserializeObject<List<Dictionary<string, Dictionary<string, int>>>>(response);
Dictionary<string, Dictionary<string, int>> firstLevel = values[0]; // Access to the first object of the list closed with ']'
Dictionary<string, int> secondLevel = firstLevel["response"]; // Access to the first object response and get's it's object context of first '}' starting from the end of response

/** This is an option, if you ever knows the name of the element (1528190991) */
int thirdLevel = secondLevel["1528190991"];  // Access to the last element of the object by it's name, context of second '}' starting from the end of response.
Console.WriteLine(thirdLevel);

/** This is another option if you doesn't know the name of the element and wants ever the last element. */
List<int> listOfValues = secondLevel.Values.ToList();
Console.WriteLine(listOfValues[listOfValues.Count-1]);

Обратите внимание, что я немного изменил ваш ответ, добавив [{\ "ответ \ ": {\" в начале становится ответом json.

Если это не ответ json, вы можете использовать этот шаблон с регулярным выражением:

:(.{2,6})}}\]$

Hopeпоможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...