【发布时间】:2013-10-17 07:33:48
【问题描述】:
这是我的工作代码:
string Input;
string Output;
Input = data;
Output = Input.Replace(@")", "");
在这里,我只是从我的字符串中删除括号“)”,如果它存在的话。现在如何扩展“)”等违规字符列表以包括“(”和“-”?
我意识到我可以再写 2 条类似输出的语句,但我想知道是否有更好的方法...
【问题讨论】:
这是我的工作代码:
string Input;
string Output;
Input = data;
Output = Input.Replace(@")", "");
在这里,我只是从我的字符串中删除括号“)”,如果它存在的话。现在如何扩展“)”等违规字符列表以包括“(”和“-”?
我意识到我可以再写 2 条类似输出的语句,但我想知道是否有更好的方法...
【问题讨论】:
如果你只是做几个替换(我看到你只做三个),不用担心 Regex 或 StringBuilders 的最简单方法是将三个 Replace 调用链接到一个语句中:
Output = Input.Replace("(", "").Replace(")", "").Replace("-", "");
...这比每次都将结果存储在输出中要好一点。
【讨论】:
LINQ 解决方案:
Output = new String(Input.Except("()-").ToArray());
【讨论】:
Except 返回一组不同的字符,因此输出不正确(例如,Test 将变为 Tes),您可以在 MSDN 上查找。
"Test" 没有重复元素。并且链接的 MSDN 页面在任何地方都没有说 input1 中的元素如果已经被输出则被省略。
ExceptIterator的实现。
test 将变为tes。 MSDN 文档确实不清楚,只有 .NET Framework 4 的社区添加 (cmets) 显示了这一点(在撰写本文时)。
Output = Regex.Replace(Input, "[()-]", "");
表达式中的[] 字符创建一个字符类。它不直接匹配那些字符。
【讨论】:
作为Regex 的替代方案,将其作为替换集合进行管理并使用StringBuilder 进行替换可能更容易。
var replacements = new[] { ")", "-" };
var output = new StringBuilder(Input);
foreach (var r in replacements)
output.Replace(r, string.Empty);
【讨论】:
var replacements = "()-"; 可以正常工作——字符串也是集合。
您可以使用Regex.Replace(),记录在案的here。
【讨论】:
您可以使用包含您的坏词的列表。现在只需使用 foreach 循环对其进行迭代并替换每个坏字符串。
StringBuilder output = new StringBuilder("(Hello) W,o.r;ld");
List<string> badwords = new List<string>();
badwords.Add("(");
badwords.Add(")");
badwords.Add(",");
badwords.Add(".");
badwords.Add(";");
badwords.ForEach(bad => output = output.Replace(bad, String.Empty));
//Result "Hello World"
亲切的问候。
//编辑: 实施了 Khan 建议的更改。
【讨论】:
source 更改为 StringBuilder,否则您将在内存中为每个 badword 创建一个新字符串。
这也可以让你做同样的事情
private static string ReplaceBadWords(string[] BadStrings, string input)
{
StringBuilder sb = new StringBuilder(input);
BadStrings.ToList().ForEach(b =>
{
if(b != "")
{
sb = sb.Replace(b, string.Empty);
}
});
return sb.ToString();
}
示例用法是
string[] BadStrings = new string[]
{
")",
"(",
"random",
""
};
string input = "Some random text()";
string output = ReplaceBadWords(BadStrings, input);
【讨论】:
我可能会使用正则表达式,因为它简洁明了。如果您害怕正则表达式,您可以教计算机为您编写它们。这是一个用于清理字符串的简单类:您只需为其提供一个无效字符列表:
class StringCleaner
{
private Regex regex ;
public StringCleaner( string invalidChars ) : this ( (IEnumerable<char>) invalidChars )
{
return ;
}
public StringCleaner ( params char[] invalidChars ) : this( (IEnumerable<char>) invalidChars )
{
return ;
}
public StringCleaner( IEnumerable<char> invalidChars )
{
const string HEX = "0123456789ABCDEF" ;
SortedSet<char> charSet = new SortedSet<char>( invalidChars ) ;
StringBuilder sb = new StringBuilder( 2 + 6*charset.Count ) ;
sb.Append('[') ;
foreach ( ushort c in charSet )
{
sb.Append(@"\u" )
.Append( HEX[ ( c >> 12 ) & 0x000F ] )
.Append( HEX[ ( c >> 8 ) & 0x000F ] )
.Append( HEX[ ( c >> 4 ) & 0x000F ] )
.Append( HEX[ ( c >> 0 ) & 0x000F ] )
;
}
sb.Append(']') ;
this.regex = new Regex( sb.ToString() ) ;
}
public string Clean( string s )
{
if ( string.IsNullOrEmpty(s) ) return s ;
string value = this.regex.Replace(s,"") ;
return value ;
}
}
一旦有了,就很容易了:
static void Main(string[] args)
{
StringCleaner cleaner = new StringCleaner( "aeiou" ) ;
string dirty = "The quick brown fox jumped over the lazy dog." ;
string clean = cleaner.Clean(dirty) ;
Console.WriteLine( clean ) ;
return;
}
其中clean的末尾是Th qck brwn fx jmpd vr th lzy dg.
简单!
【讨论】: