Как я могу удалить символы алфавита из строки ?

Это код:

StringBuilder sb = new StringBuilder(); Regex rgx = new Regex("[^a-zA-Z0-9 -]"); var words = Regex.Split(textBox1.Text, @"(?=(?<=[^\s])\s+\w)"); for (int i = 0; i < words.Length; i++) { words[i] = rgx.Replace(words[i], ""); } 

Когда im делает Regex.Split() слова содержат также строки с символами внутри для exmaple:

Daniel>

или же

Hello:

или же

\r\nNew

или же

hello---------------------------

И мне нужно получить только слова без всех знаков

Поэтому я попытался использовать этот цикл, но я заканчиваю тем, что в словах есть много мест с "" И некоторые места с помощью только ------------------------

И я не могу использовать это как строки позже в моем коде.

Вы не нуждаетесь в регулярном выражении, чтобы очищать не-буквы. Это приведет к удалению всех букв, отличных от юникода.

 public string RemoveNonUnicodeLetters(string input) { StringBuilder sb = new StringBuilder(); foreach(char c in input) { if(Char.IsLetter(c)) sb.Append(c); } return sb.ToString(); } 

Кроме того, если вы хотите разрешить только латинские буквы, вы можете использовать это

 public string RemoveNonLatinLetters(string input) { StringBuilder sb = new StringBuilder(); foreach(char c in input) { if(c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') sb.Append(c); } return sb.ToString(); } 

Benchmark против Regex

 public static string RemoveNonUnicodeLetters(string input) { StringBuilder sb = new StringBuilder(); foreach (char c in input) { if (Char.IsLetter(c)) sb.Append(c); } return sb.ToString(); } static readonly Regex nonUnicodeRx = new Regex("\\P{L}"); public static string RemoveNonUnicodeLetters2(string input) { return nonUnicodeRx.Replace(input, ""); } static void Main(string[] args) { Stopwatch sw = new Stopwatch(); StringBuilder sb = new StringBuilder(); //generate guids as input for (int j = 0; j < 1000; j++) { sb.Append(Guid.NewGuid().ToString()); } string input = sb.ToString(); sw.Start(); for (int i = 0; i < 1000; i++) { RemoveNonUnicodeLetters(input); } sw.Stop(); Console.WriteLine("SM: " + sw.ElapsedMilliseconds); sw.Restart(); for (int i = 0; i < 1000; i++) { RemoveNonUnicodeLetters2(input); } sw.Stop(); Console.WriteLine("RX: " + sw.ElapsedMilliseconds); } 

Выход (SM = String Manipulation, RX = Regex)

 SM: 581 RX: 9882 SM: 545 RX: 9557 SM: 664 RX: 10196 

Решение keyboardP является достойным – подумайте об этом. Но, как я уже говорил в комментариях, регулярные выражения на самом деле являются правильным инструментом для работы, вы просто делаете это излишне сложным. Фактическое решение – однострочный:

 var result = Regex.Replace(input, "\\P{L}", ""); 

\P{…} указывает class символов Юникода, который мы не хотим сопоставлять (противоположность \p{…} ). L – это символ символа Юникода для букв .

Конечно, имеет смысл инкапсулировать это в метод, как это сделала клавиатура. Чтобы избежать повторной компиляции регулярного выражения снова, вы также должны рассмотреть возможность вытащить создание регулярного выражения из фактического кода (хотя это, вероятно, не окажет большого влияния на производительность):

 static readonly Regex nonUnicodeRx = new Regex("\\P{L}"); public static string RemoveNonUnicodeLetters(string input) { return nonUnicodeRx.Replace(input, ""); } 

Чтобы помочь Konrad и keyboardP решить их различия, я провел тестовый тест, используя их код. Оказывается, код клавиатурыPpx в 10 раз быстрее кода Konrad

  using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { string input = "asdf234!@#*advfk234098awfdasdfq9823fna943"; DateTime start = DateTime.Now; for (int i = 0; i < 100000; i++) { RemoveNonUnicodeLetters(input); } Console.WriteLine(DateTime.Now.Subtract(start).TotalSeconds); start = DateTime.Now; for (int i = 0; i < 100000; i++) { RemoveNonUnicodeLetters2(input); } Console.WriteLine(DateTime.Now.Subtract(start).TotalSeconds); } public static string RemoveNonUnicodeLetters(string input) { StringBuilder sb = new StringBuilder(); foreach (char c in input) { if (Char.IsLetter(c)) sb.Append(c); } return sb.ToString(); } public static string RemoveNonUnicodeLetters2(string input) { var result = Regex.Replace(input, "\\P{L}", ""); return result; } } } 

я получил

 0.12 1.2 

как выход

ОБНОВИТЬ:

Чтобы увидеть, является ли это компиляцией Regex, которая замедляет метод Regex, я помещаю регулярное выражение в статическую переменную, которая создается только один раз.

  static Regex rex = new Regex("\\P{L}"); public static string RemoveNonUnicodeLetters2(string input) { var result = rex.Replace(input,m => ""); return result; } 

Но это не повлияло на время работы.