2010-10-21 2 views
3

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

ответ

8

Try:

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

В вышеприведенном \\w соответствует символам слова. Это A-Z, a-z, - и _ если я прав. Если вы хотите совместить все, что не является пространством, вы можете использовать \\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 

в $ В2 конечно опущено, поскольку он не имеет косое пространства.

+0

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

+1

Я изложил ответ на примере. Я не понимаю, почему это не вернет все элементы в вашем тестовом входе. Не могли бы вы предоставить пример ввода, который возвращает только последнее совпадение? –

+0

Oh Извините, ваше регулярное выражение отлично работает, на самом деле я не перебирал ни одного совпадения, я использовал ваши совпадения кода [0] .Groups [1] .Value; и я получал только один матч. см. следующий код, он работает правильно и возвращает все совпадения. добавление кода в следующий комментарий. –

0
var a1 = "fdjksf $jgjkd $hfj".Split(" ".ToCharArray()) 
            .ToList() 
            .Where(X=>Regex.Match(X , "(\\$[a-zA-Z]*)").Success); 
+0

Спасибо за ваш быстрый ответ, но это только возвращает мне последний матч из строки, я хочу получить все матчи. –

+0

Отредактировано в ...... –

3

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

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

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

 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 

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

+0

Я думаю, что вы не работали над оптимизацией производительности, метод split и foreach loop itslef критичны по производительности, поэтому я всегда стараюсь их избегать, и именно поэтому я попросил регулярное выражение в моем вопрос. –

+0

Пожалуйста, проверьте часть «edit» моего ответа. –

+0

hmm, хороший пример, я впечатлен, мне когда-то приходилось работать с методом Split и foreach, они оба были критичными по производительности, поэтому мы пользовательские альтернативы. –

Смежные вопросы