2013-07-25 4 views
2

У меня есть следующая строка:Распаковка неизвестной строки между двумя известными строками

string nextEvent = "[[\"nextData\", \"RANDOM MESSAGE\"], [\"moreInfo\", {\"num\": 3204}]]" 

Мне нужно получить «RANDOM MESSAGE» (без кавычек) в отдельную строку. Теперь было бы легко, если бы RANDOM MESSAGE была постоянной, но это не так. Предположим, что он генерируется через пользовательский ввод и каждый раз отличается по значению и длине.

Как я могу извлечь из этого сообщения сообщение? Я пробовал использовать Substring с IndexOf, но каждый раз я получал неправильные результаты, это довольно запутанно.

+0

Может остальные изменения строки? –

+0

В '' [[\ "nextData \" ", \" "+ сообщение +" [\ "moreInfo \", {\ "num \": "' сообщение - единственное, что изменится. – Adam

+2

это похоже на JSON-словарь. вы можете пойти для разбора его на «Словарь dict = JSON.Parse > (nextEvent)", а затем извлечь его с помощью: 'dict (" nextData ")' – Vogel612

ответ

0

Вы можете использовать регулярное выражение, чтобы получить его:

string input = "[[\\\"nextData\\\", \\\"RANDOM MESSAGE\\\"], [\\\"moreInfo\\\", {\\\"num\\\": 3204}]]"; 
string pattern = "^\\[\\[\\\\\"nextData\\\\\",\\s*\\\\\"(?<message>[\\S ]+)\\\\\"\\],\\s*\\[\\\\\"moreInfo\\\\\",\\s*\\{\\\\\"num\\\\\":\\s*\\d+\\}\\]\\]$"; 
Regex r1 = new Regex(pattern); 

Match match = r1.Match(input); 
if (match.Success) 
    Console.WriteLine(match.Groups["message"].Value); 
0

Если вы хотите метод 'грубой силы':

String nextEvent = "[[\"nextData\", \"RANDOM MESSAGE\"], [\"moreInfo\", {\"num\": 3204}]]"; 
String tmp = nextEvent.Trim(new Char[] { '[', ']' }); 
String[] sa = tmp.Split(','); 
String rndMsg = sa[1].Trim().Trim(new Char[] { '[', ']', '\"' }); 
0

вы можете использовать простые шпагат, как это:

string nextEvent = "[[\"nextData\", \"RANDOM MESSAGE\"], [\"moreInfo\", {\"num\": 3204}]]"; 
    var strs = nextEvent.Split(']'); 
    var ds = strs[0].Split(','); 
    var m = ds[1].TrimStart('"', ' '); 
    m = m.TrimEnd('"'); 
0

Третьим возможным решением, хотя и не очень эффективным, является следующее:

Возьмите вам строку и разобрать его как словарь:

String nextEvent="[[\"nextData\",\"RANDOM MESSAGE\"],[\"moreInfo\",{\"num:\": 3204}]]"; 
Dictionary<string, object> dict = JSON.Parse<Dictionary<string,object>>(nextEvent); 
String randomMessage = dict("nextData"); 

это становится актуальным, когда у вас есть очень длинная строка в этом формате и должны извлечь несколько «полей» из него

0

Если строки до/после постоянны вы можете получить случайную часть сообщения, просто выполнив:

int startIndex = ("[[\"nextData\", \"").Length; 
int endIndex = nextEvent.IndexOf(", [\"moreInfo\""); 
string randomMessage = nextEvent.Substring(startIndex, endIndex - startIndex); 

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

string[] temp = nextEvent.Split(new string[] { "[[\"nextData\", \"" }, StringSplitOptions.None); 
//temp[1] = "RANDOM MESSAGE..." 
0

Использование JSON.NET

using Newtonsoft.Json; 
using Newtonsoft.Json.Linq; 

class Test 
{ 
    static void Main() 
    {    
     string nextEvent = "[[\"nextData\", \"RANDOM MESSAGE\"], [\"moreInfo\", {\"num\": 3204}]]"; 
     JObject json = JObject.Parse("{\"j\":" + nextEvent + "}"); 
     string randomMessage = (string)json["j"][0][1]; 
     Console.WriteLine(randomMessage); // gives "RANDOM MESSAGE" 
    } 
} 
Смежные вопросы