Итак, сегодня я писал код, который в основном выглядит так:
string returnString = s.Replace("!", " ")
.Replace("@", " ")
.Replace("#", " ")
.Replace("$", " ")
.Replace("%", " ")
.Replace("^", " ")
.Replace("*", " ")
.Replace("_", " ")
.Replace("+", " ")
.Replace(" = ", " ")
.Replace("\", " ")
Что не очень приятно. Мне было интересно, есть ли регулярное выражение или что-то, что я мог бы написать, чтобы заменить все вызовы функции Replace()?
@Cawas: Здесь: dnovatchev.spaces.live.com/blog/cns!44B0A32C2CCF7488!353.ent ry См. Описание функции XPath translate () здесь: w3.org/TR/xpath-functions/#func-translate
@dimitre круто, xpath хорош. Но как я мог узнать это только из вашего комментария?
@Cawas: Я удалил свой ответ почти сразу после того, как опубликовал его в декабре 2008 года (сразу получил два отрицательных голоса). К сожалению, для многих людей, интересующихся C#, даже упоминание XSLT оскорбительно :(. Такие люди теряют способность к рациональному / критическому мышлению.





Вы можете использовать Regex.Replace (). Все символы могут быть помещены в квадратные скобки, что соответствует любому символу в квадратных скобках. Некоторые специальные символы должны быть экранированы обратной косой чертой, и я использую здесь строку @verbatim, поэтому мне не нужно экранировать их дважды для компилятора C#. Первый параметр - это строка ввода, а последний параметр - строка замены.
var returnString = Regex.Replace(s,@"[!@#$%\^*_\+=\]"," ");
s/[!@#$%^*_+=\]/ /
Было бы для него регулярное выражение ... в C# вы должны иметь возможность использовать
Regex.Replace(yourstring, "[!@#$%^*_+=\]", "" );
Хотя мой C# ржавый ..
К вашему сведению - если вам нужно изменить это регулярное выражение, вам нужно знать язык регулярных выражений. Это довольно просто, и как разработчик вы действительно обязаны добавлять регулярные выражения в свой набор инструментов - они вам не нужны каждый день, но возможность применять их соответствующим образом там, где это необходимо, когда возникнет необходимость, окупит вас. в десять раз больше за начальное усилие. Вот ссылка на веб-сайт с первоклассными, простыми в использовании учебными пособиями и справочными материалами по регулярным выражениям: regular-expressions.info. Как только вы почувствуете регулярные выражения и захотите использовать их в своем программном обеспечении, вы захотите купить Regex Buddy. Это дешевый и необычный инструмент для изучения и использования регулярных выражений. Я очень редко покупаю инструменты разработки, но этот стоил каждого пенни. Это здесь: Регулярное выражение Бадди
Если вы не хотите углубляться в Regex, вот пара других возможностей метода расширения.
Вы можете передать конкретные символы, которые хотите заменить:
static public string ReplaceCharsWithSpace(this string original, string chars)
{
var result = new StringBuilder();
foreach (var ch in original)
{
result.Append(chars.Contains(ch) ? ' ' : ch);
}
return result.ToString();
}
Или, если вы знаете, что хотите сохранить или исключить только определенные типы символов, вы можете использовать различные методы в char, такие как IsLetter, IsDigit, IsPunctuation и IsSymbol:
static public string ReplaceNonLetterCharsWithSpace(this string original)
{
var result = new StringBuilder();
foreach (var ch in original)
{
result.Append(char.IsLetter(ch) ? ch : ' ');
}
return result.ToString();
}
Вот как вы могли бы использовать каждую из этих возможностей:
string s = "ab!2c";
s = s.ReplaceCharsWithSpace(@"!@#$%^*_+=/"); // s contains "ab c"
string t = "ab3*c";
t = t.ReplaceNonLetterCharsWithSpace(); // t contains "ab c"
Возможно, вы можете сократить это до пары строк, если хотите, используя лямбда-выражение и List<>, ForEach.
using System.Collections.Generic;
namespace ReplaceWithSpace
{
class Program
{
static void Main(string[] args)
{
string someString = "#1, 1+1=2 $string$!";
var charsToRemove = new List<char>(@"!@#$%^*_+=\");
charsToRemove.ForEach(c => someString = someString.Replace(c, ' '));
System.Diagnostics.Debug.Print(someString); //" 1, 1 1 2 string "
}
}
}
Проблема с этим подходом заключается в том, что для каждого заменяемого символа создается множество промежуточных строк. Это та же проблема, что и исходный вопрос, который решает решение регулярного выражения.
@lomaxx: см. решение dimitre, которое вообще избегает использования регулярных выражений.