Регулярное выражение для подстроки в 2 скобках, например, [я хочу этот текст] НО пропустить скобки? - PullRequest
2 голосов
/ 27 января 2009

Мне удалось найти Regex, чтобы получить почти тот результат, который я хочу здесь, т.е.

Regex r1 = new Regex(@"\[(.*?)\]");
string row = HEADERNAMES[COL1,COL2,COL3,COL4];
Match match = r1.Match(row);
string result = match.ToString();

Выходы: «[COL1, COL2, COL3, COL4]»;

Я знаю, что могу использовать:

result.Replace("[", "");
result.Replace("]", "");

чтобы получить именно то, что я хочу, но мне было интересно, есть ли способ опустить разделители [и] из результата Regex без выполнения методов String.

Я бы подумал, что есть более элегантное решение с использованием самого Regex ??

Заранее спасибо.

Ответы [ 3 ]

10 голосов
/ 27 января 2009
Regex r1 = new Regex(@"\[(.+)\]");
string row = "HEADERNAMES[COL1, COL2, COL3, COL4]";
// Regex puts capture groups (i.e. things captured between ( and ) ) 
// in Groups collection
string match = r1.Match(row).Groups[1].Value;
//match = "COL1, COL2, COL3, COL4"
1 голос
/ 27 января 2009

Есть одно важное замечание в решении, представленном «Аку» (у меня пока нет представителя, чтобы комментировать)

Следует отметить, что 2-й элемент в коллекции Groups содержит нужное вам значение. Первый элемент (Groups (0)) эквивалентен всей совпадающей строке (Match.ToString () или Match.Value)

0 голосов
/ 27 января 2009

Еще один способ сделать это, хотя я думаю, что это немного медленнее, чем в примере с aku:

        Regex r1 = new Regex(@"(?<=\[).*(?=\])");
        string row = "HEADERNAMES[COL1, COL2, COL3, COL4]";
        Match match = r1.Match(row);
        Console.WriteLine(match.ToString());

        /* Output:
        COL1, COL2, COL3, COL4
        */

Не знаю, но я подозреваю, что вы можете быть после имен столбцов и собираетесь сделать .Split для вашей строки результата. Знаете ли вы, что вы можете получить все имена столбцов по отдельности, используя такое регулярное выражение, как это?

        Regex r1 = new Regex(@"\[(?:(?<colName>[^,\]]*)(?:,\s)?)*\]");
        string row = "HEADERNAMES[COL1, COL2, COL3, COL4]";
        Match match = r1.Match(row);

        foreach(Capture c in match.Groups["colName"].Captures)
            Console.WriteLine(c.ToString());

        /* Output:
        COL1
        COL2
        COL3
        COL4
        */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...