Регулярное выражение заменить определенные символы


Кто-нибудь знает лучше / чище способ, чтобы написать следующее:

GetSafeTagName(txtUserInput.text);

public static string GetSafeTagName(string tag)
{
    tag = tag.ToUpper()
    .Replace("'","`")
    .Replace('"','`')
    .Replace("&", "and")
    .Replace(",",":")
    .Replace(@"\","/"); //Do not allow escaped characters from user
    tag = Regex.Replace(tag, @"\s+", " "); //multiple spaces with single spaces
    return tag;
}

Спасибо!



21423
4
задан 9 ноября 2011 в 05:11 Источник Поделиться
Комментарии
3 ответа

Вы могли бы использовать регулярные выражения и словарь чтобы сделать поиск заменить:

// This regex matches either one of the special characters, or a sequence of 
// more than one whitespace characters.
Regex regex = new Regex("['\"&,\\\\]|\\s{2,}");

var map = new Dictionary<string, string> {
{ "'", "`"},
{ "\"", "`"},
{ "&", "and" },
{ ",", ":" },
{ "\\", "/" }
};

// If the length of the match is greater that 1, then it's a sequence
// of spaces, and we can replace it by a single space. Otherwise, we
// use the dictionary to map the character.
string output = regex.Replace(input.ToUpper(),
m => m.Value.Length > 1 ? " " : map[m.Value]);

4
ответ дан 9 ноября 2011 в 05:11 Источник Поделиться

Когда мне пришлось делать нечто подобное, я использовал словарь для определения замены.

А потом что-то подобное на замену:

foreach( KeyValuePair<string, string> pair in replacements)
{
str = str.Replace(pair.Key, pair.Value);
}

http://msdn.microsoft.com/en-us/library/5tbh8a42.aspx

0
ответ дан 9 ноября 2011 в 06:11 Источник Поделиться

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

internal static class SafeTag
{
private static readonly List<Replacement> replacements = new List<Replacement>
{
new Replacement("'", "`"),
new Replacement("\"", "`"),
new Replacement("&", "and"),
new Replacement(",", ":"),
new Replacement("\\", "/")
};

private static readonly Regex spaces = new Regex("\\s+", RegexOptions.Compiled);

public static string GetSafeTagName(this string tag)
{
var parse = new StringBuilder(tag.ToUpper());
replacements.ForEach(replacement => parse = parse.Replace(replacement.Original, replacement.ToReplaceWith));
return spaces.Replace(parse.ToString(), " ");
}

private struct Replacement
{
private readonly string original;

private readonly string toReplaceWith;

internal Replacement(string original, string toReplaceWith)
{
this.original = original;
this.toReplaceWith = toReplaceWith;
}

internal string Original
{
get
{
return this.original;
}
}

internal string ToReplaceWith
{
get
{
return this.toReplaceWith;
}
}
}
}

0
ответ дан 9 ноября 2011 в 07:11 Источник Поделиться