регулярное выражение для отмены выбора внутри выбора - PullRequest
1 голос
/ 05 апреля 2011

Например,

У меня есть строка, содержащая, скажем,

функция main {

// TODO print 'hello {cmd get world} world {nice}! 's asdads

привет 'l {o} l'. 'Asd'

}

Как я могу выбрать только те слова, которые находятся внутри '' и не находятся внутри {}. Этот пример вернет вывод:

соответствует 1:

'привет {

} ​​мир {

}!

соответствует 2:

л {

} л '* * одна тысяча тридцать два

соответствует 3:

'ASD'

спасибо большое!

Ответы [ 3 ]

0 голосов
/ 05 апреля 2011

Если бы вы просто хотели, чтобы все шесть совпадающих строк были по отдельности, я бы использовал ['}].*?['{], но вам, кажется, нужны три строки, в этом случае я сначала заменил бы }[^']*?{ на }{, а затем сопоставил бы '.*?'.

0 голосов
/ 05 апреля 2011

Это даст вам то, что вам нужно, в два этапа:

IEnumerable<string[]> captures = 
    // Get the 'single quoted' tokens
    Regex.Matches(s, "'[^']*'").Cast<Match>() 
    // Split each token by { blocks }, but keep the curly braces.
    .Select(quoteMatch => Regex.Split(quoteMatch.Value, @"(?<=\{)[^{}]*(?=\})"))
    .ToArray();

Результатом является коллекция массивов строк - каждая коллекция - это «совпадение», а каждая строка - «группа».

Можно сделать все это в одном регулярном выражении .Net, но это не очень красиво и с ним гораздо сложнее работать. Вот рабочее решение: http://ideone.com/qaceF, но я не думаю, что это правильный ответ на вопрос, когда есть гораздо более простые альтернативы.

0 голосов
/ 05 апреля 2011
MatchCollection matches = Regex.Matches(myInput, "'[^']+'", RegexOptions.SingleLine | RegexOptions.MultiLine);

Теперь хитрость заключается в том, чтобы выбрать только четные индексы найденных совпадений.

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