Как найти все слова, начинающиеся со знака «$» и заканчивающиеся пробелом, в длинной строке? - PullRequest
5 голосов
/ 21 октября 2010

Как в C # найти все слова, начинающиеся со знака '$' и заканчивающиеся пробелом, в длинной строке, используя регулярные выражения?

Ответы [ 3 ]

9 голосов
/ 21 октября 2010

Попробуйте:

var matches = Regex.Matches(input, "(\\$\\w+) ");

В приведенном выше тексте \\w соответствует символам слова.Это AZ, az, - и _ если я прав.Если вы хотите сопоставить все, что не является пробелом, вы можете использовать \\S.Если вы хотите определенный набор, укажите это, например, через [a-zA-Z0-9].

. Скобки вокруг (\\$\\w+) гарантируют конкретное совпадение, matches[0].Groups[1].Value; дает значение внутри бэкетов (т. Е. Исключая завершающийпробел).

В качестве полного примера:

string input = "$a1 $a2 $b1 $b2";

foreach (Match match in Regex.Matches(input, "(\\$\\w+) "))
{
    Console.WriteLine(match.Groups[1].Value);
}

Это приводит к следующему выводу:

$a1
$a2
$b1

$ b2, конечно, опущен, поскольку онзавершающий пробел.

5 голосов
/ 21 октября 2010

Вы можете попробовать это без регулярных выражений, это может быть быстрее.

string longText = "";
    List<string> found = new List<string>();
    foreach (var item in longText.Split(' '))
    {
        if (item.StartsWith("$"))
        {
            found.Add(item);
        }
    }

EDIT: После комментария Зейна Шейха я написал простую программу для тестирования, вот результаты.

        string input = "$a1 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2";
        var s1 = Stopwatch.StartNew();
        double first;
        foreach (Match match in Regex.Matches(input, "(\\$\\w+) "))
        {
        }
        s1.Stop();
        Console.WriteLine(" 1) " + (s1.Elapsed.TotalMilliseconds * 1000 * 1000).ToString("0.00 ns"));
        first = s1.Elapsed.TotalMilliseconds;
        s1.Reset();

        s1 = Stopwatch.StartNew();

        foreach (var item in input.Split(' '))
        {
            if (item.StartsWith("$"))
            {
            }
        }
        s1.Stop();
        Console.WriteLine(" 2) " + (s1.Elapsed.TotalMilliseconds * 1000 * 1000).ToString("0.00 ns"));
        Console.WriteLine(s1.Elapsed.TotalMilliseconds - first);

Выход:

1) 730600.00 ns

2)  53000.00 ns

-0.6776

Это означает, что строковые функции (также с foreach) работают быстрее, чем функции регулярных выражений;)

0 голосов
/ 21 октября 2010
var a1 = "fdjksf $jgjkd $hfj".Split(" ".ToCharArray())
                                     .ToList()
                                     .Where(X=>Regex.Match(X , "(\\$[a-zA-Z]*)").Success);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...