我需要从不在 Ascii 32 到 175 范围内的字符串中删除字符,其他任何内容都必须删除。
我不太清楚 RegExp 是否可以成为最好的解决方案,而不是使用 .replace() 或 .remove() 之类的东西来粘贴每个无效字符或其他东西。
任何帮助将不胜感激。
您可以使用
Regex.Replace(myString, @"[^\x20-\xaf]+", "");
这里的正则表达式由一个字符类 ( ) 组成,它由U+0020 到 U+00AF(32-175,以十六进制表示)范围内的[...]
所有字符组成,而不是(在类的开头)。^
就正则表达式而言,这是相当基本的,但可能会让不太熟悉它的人感到困惑。
但你也可以走另一条路:
new string(myString.Where(c => (c >= 32) && (c <= 175)).ToArray());
这可能主要取决于您更喜欢阅读什么。如果没有太多的正则表达式经验,我会说第二个会更清楚。
一些性能测量,每个 10000 轮,以秒为单位:
2000 characters, the first 143 of which are between 32 and 175
Regex without + 4.1171
Regex with + 0.4091
LINQ, where, new string 0.2176
LINQ, where, string.Join 0.2448
StringBuilder (xanatos) 0.0355
LINQ, horrible (HatSoft) 0.4917
2000 characters, all of which are between 32 and 175
Regex without + 0.4076
Regex with + 0.4099
LINQ, where, new string 0.3419
LINQ, where, string.Join 0.7412
StringBuilder (xanatos) 0.0740
LINQ, horrible (HatSoft) 0.4801
所以是的,我的方法是最慢的:-)。您可能应该使用 xanatos 的答案,并将其包装在一个具有漂亮、清晰名称的方法中。对于内联使用或快速而肮脏的事情或性能无关紧要的地方,我可能会使用正则表达式。
因为我认为,如果您不知道如何编写正则表达式,则不应使用它,尤其是对于如此简单的事情:
var sb = new StringBuilder();
foreach (var c in str)
{
if (c >= 32 && c <= 175)
{
sb.Append(c);
}
}
var str2 = str.ToString();
使用正则表达式[^\x20-\xAF]+
并将其替换为空字符串""
Regex.Replace(str, @"[^\x20-\xAF]+", "");
以这种方式使用linq怎么样
string text = (from c in "AAA hello aaaa #### Y world"
let i = (int) c where i < 32 && i > 175 select c)
.Aggregate("", (current, c) => current + c);
static unsafe string TrimRange(string str, char from, char to)
{
int count = 0;
for (int i = 0; i < str.Length; i++)
{
char ch = str[i];
if ((ch >= from) && (ch <= to))
{
count++;
}
}
if (count == 0)
return String.Empty;
if (count == str.Length)
return str;
char * result = stackalloc char[count];
count = 0;
for (int i = 0; i < str.Length; i++)
{
char ch = str[i];
if ((ch >= from) && (ch <= to))
{
result[count ++] = ch;
}
}
return new String(result, 0, count);
}