Как удалить из букв не буквенно-цифровые символы (включая пробелы)?
Как удалить не буквенно-цифровые символы из строки и свободные пробелы в С# с помощью Replace?
Я хочу сохранить a-z, A-Z, 0-9 и ничего больше (даже не "пробелы" ).
"Hello there(hello#)".Replace(regex-i-want, "");
должен давать
"Hellotherehello"
Я пробовал "Hello there(hello#)".Replace(@"[^A-Za-z0-9 ]", "");
, но пробелы остаются.
Ответы
Ответ 1
В вашем регулярном выражении вы исключили пробелы из сопоставления (и вы не использовали Regex.Replace()
, который я полностью просмотрел...):
result = Regex.Replace("Hello there(hello#)", @"[^A-Za-z0-9]+", "");
должен работать. +
делает регулярное выражение несколько более эффективным, одновременно сопоставляя несколько последовательных символов без алфавитно-цифрового символа, а не один за другим.
Если вы хотите сохранить буквы и цифры, отличные от ASCII, используйте следующее регулярное выражение:
@"[^\p{L}\p{N}]+"
который оставляет
BonjourmesélèvesGutenMorgenliebeSchüler
вместо
BonjourmeslvesGutenMorgenliebeSchler
Ответ 2
Вы можете использовать Linq для фильтрации требуемых символов:
String source = "Hello there(hello#)";
// "Hellotherehello"
String result = new String(source
.Where(ch => Char.IsLetterOrDigit(ch))
.ToArray());
или
String result = String.Concat(source
.Where(ch => Char.IsLetterOrDigit(ch)));
И поэтому вам не нужно регулярных выражений.
Ответ 3
Или вы тоже можете это сделать:
public static string RemoveNonAlphanumeric(string text)
{
StringBuilder sb = new StringBuilder(text.Length);
for (int i = 0; i < text.Length; i++)
{
char c = text[i];
if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c >= '0' && c <= '9')
sb.Append(text[i]);
}
return sb.ToString();
}
Использование:
string text = SomeClass.RemoveNonAlphanumeric("text LaLa (lol) á ñ $ 123 ٠١٢٣٤");
//text: textLaLalol123
Ответ 4
Ошибка, сделанная выше, неправильно использовала Replace (она не принимает регулярное выражение, спасибо CodeInChaos).
Следующий код должен делать то, что было указано:
Regex reg = new Regex(@"[^\p{L}\p{N}]+");//Thanks to Tim Pietzcker for regex
string regexed = reg.Replace("Hello there(hello#)", "");
Это дает:
regexed = "Hellotherehello"
Ответ 5
И как операция замены как метод расширения:
public static class StringExtensions
{
public static string ReplaceNonAlphanumeric(this string text, char replaceChar)
{
StringBuilder result = new StringBuilder(text.Length);
foreach(char c in text)
{
if(c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c >= '0' && c <= '9')
result.Append(c);
else
result.Append(replaceChar);
}
return result.ToString();
}
}
И тест:
[TestFixture]
public sealed class StringExtensionsTests
{
[Test]
public void Test()
{
Assert.AreEqual("text_LaLa__lol________123______", "text LaLa (lol) á ñ $ 123 ٠١٢٣٤".ReplaceNonAlphanumeric('_'));
}
}
Ответ 6
var text = "Hello there(hello#)";
var rgx = new Regex("[^a-zA-Z0-9]");
text = rgx.Replace(text, string.Empty);
Ответ 7
Используйте следующее регулярное выражение, чтобы удалить все символы из строки с помощью Regex.Replace
([^A-Za-z0-9\s])
Ответ 8
В .Net 4.0 вы можете использовать метод IsNullOrWhitespace класса String для удаления так называемых пробелов. Пожалуйста, посмотрите здесь http://msdn.microsoft.com/en-us/library/system.string.isnullorwhitespace.aspx
Однако, как указывает @CodeInChaos, существует множество символов, которые можно рассматривать как буквы и цифры. Вы можете использовать регулярное выражение, только если хотите найти A-Za-z0-9.