Найти все символы между круглыми скобками

#c# #regex

#c# #регулярное выражение

Вопрос:

У меня есть список взаимных фондов, из которых мне нужно извлечь символы тикера. Список выглядит следующим образом:

FID SEL TELECOMM (FSTCX)29.07.1985
УТИЛИТЫ FID SEL (FSUTX)12/10/1981
SPTN REAL ES IDX ADV (FSRVX)08.09.2011
SA НОВЫЕ MKTS FOF (FLILX)02.05.2012
SA INTL MULTI MGR (FMJDX)02.05.2012
FID ASSET MGR 85% (FAMRX)24.09.1999

Мне нужно извлечь 5 символов из каждой строки, которые находятся в parens (). Затем я собираюсь записать в новый файл, но пока я не могу вернуть только тикер (символы между скобками). Я должен получить:

FSTCX
FSUTX
FSRVX
FLILX
FMJDX
FAMRX

Вместо этого он возвращает всю строку. Вот что у меня есть (в C #).

 Regex pattern = new Regex(@"(([A-Z]*))");

StreamReader reader = new StreamReader("C:\MyDocuments\TickerList.txt");

string line;

while ((line = reader.ReadLine()) != null)                
{
    Match match = pattern.Match(line);

    if (match.Success)
    {
        Console.WriteLine(line);
        Console.ReadLine();
    }
}
 

Комментарии:

1. Уверен, вам нужно посмотреть match.Groups[1] на ваше содержимое.

2. Вау, вот и все. Однако он также возвращает скобки. Разве [A-Z] не должен извлекать только символы?

Ответ №1:

Console.WriteLine(line); не включает match .

 if (match.Success)
{
    Console.WriteLine(match.Groups[1].Value);
    Console.ReadLine();
} 

И вы также можете использовать File.ReadLines :

 Regex pattern = new Regex(@"(([A-Z]*))");

for (var line in File.ReadLines(@"C:MyDocumentsTickerList.txt")) {
    Match match = pattern.Match(line);

    if (match.Success) {
        Console.WriteLine(match.Groups[1].Value);
        Console.ReadLine();
    }
}
 

Или, может быть…

 File.ReadLines(@"C:MyDocumentsTickerList.txt")
    .Select(pattern.Match)
    .Where(m => m.Success)
    .Select(m => m.Groups[1].Value)
 

(возможно)

Ответ №2:

Регулярное выражение Linq

 string input = File.ReadAllText("C:\MyDocuments\TickerList.txt");

var values = Regex.Matches(input, @"((. ?))").Cast<Match>()
                .Select(m => m.Groups[1].Value)
                .ToList();
 

Ответ №3:

Ваше регулярное выражение будет,

 Regex pattern = new Regex(@"(([^)]*))");
 

ДЕМОНСТРАЦИЯ

И не забудьте распечатать соответствующую группу 1.

Ответ №4:

Попробуйте использовать приведенное ниже регулярное выражение и получите соответствующую группу.

 ((w ))
 

ДЕМОНСТРАЦИЯ

Строковые литералы для использования в программах: @"((w ))" для c#