C # Regex Split - все в квадратных скобках

В настоящее время я пытаюсь разбить строку на C # (последние версии .NET и Visual Studio 2008), чтобы получить все, что находится в квадратных скобках, и отбросить оставшийся текст.

Например: «Антагонист H1-рецептора [HSA: 3269] [ПУТЬ: hsa04080 (3269)]»

В этом случае меня интересует получение "HSA: 3269" и "ПУТЬ: hsa04080 (3269)" в виде массива строк.

Как этого добиться?


person João Pereira    schedule 11.04.2009    source источник


Ответы (2)


Split здесь вам не поможет; вам нужно использовать регулярные выражения:

// using System.Text.RegularExpressions;
// pattern = any number of arbitrary characters between square brackets.
var pattern = @"\[(.*?)\]";
var query = "H1-receptor antagonist [HSA:3269] [PATH:hsa04080(3269)]";
var matches = Regex.Matches(query, pattern);

foreach (Match m in matches) {
    Console.WriteLine(m.Groups[1]);
}

Дает ваши результаты.

person Konrad Rudolph    schedule 11.04.2009
comment
Считаете ли вы неудобным в версии 3.5, что перечислитель MatchCollection по-прежнему возвращает Match as Object? - person chakrit; 11.04.2009
comment
в любом случае ... лучшее совпадение регулярного выражения может быть [([^]] *)], чтобы быть в безопасности :-) - person chakrit; 11.04.2009
comment
@chakrit: 1. Да, но это нельзя изменить по причинам обратной совместимости. На самом деле обидно. Microsoft должна хватить смелости сделать, как Python 3: выбросить все, что было до версии 2.0, навсегда и внести критические изменения. Но этого не произойдет ... - person Konrad Rudolph; 11.04.2009
comment
@chakrit: 2. Это действительно была моя первая версия (я обычно всегда использую явные группы), но я передумал, потому что это более многословно, чтобы выразить точно такой же шаблон (для всех практических целей). Здесь действительно нет никакого риска в использовании более неявного символьного класса вместе с ненадежным квантификатором. - person Konrad Rudolph; 11.04.2009
comment
@KonradRudolph - Вот я получаю это [HSA: 3269] .... что будет за Regex, если я захочу HSA: 3269. Без квадратных скобок? - person Rahul Khandelwal; 03.02.2017
comment
@chakrit - Во-первых, вам нужно избегать внешних квадратных скобок. Во-вторых, результаты все равно те же, так почему вы говорите о безопасности? - person Robino; 16.05.2017
comment
Используйте LINQ для получения захватов из группы 1: var results = Regex.Matches(query, pattern).Cast<Match>().Select(m => m.Groups[1].Value).ToList(); - person Wiktor Stribiżew; 12.04.2018

Попробуй это

string mystr = "Hello my name is  {robert} and i live in  {florida}";

List<string> myvariables = new List<string>();
while (mystr.Contains("{"))
{
    myvariable.Add(mystr.Split('{', '}')[1]);
    mystr = mystr.Replace("{" + mystr.Split('{', '}')[1] + "}", "");
};

Таким образом, у меня будет массив, который будет содержать Роберта и Флориду.

person BobSpring    schedule 07.09.2017
comment
В этом коде предполагается, что скобки всегда совпадают идеально (у вас никогда не бывает } перед {, и никогда не бывает { дважды подряд. Это также очень неэффективно, потому что оно разбивает строку много раз без необходимости. Это было бы намного эффективнее и надежнее использовать Regex, как и другой ответ. - person AJ Richardson; 07.09.2017