使用正则表达式删除所有独有的拉丁字符

时间:2011-03-16 19:30:09

标签: c# regex resources

我正在开发一个葡萄牙语软件,因此我的许多实体都有'maça'或'lição'等名称,我想将该实体用作资源键。所以我想保留除'ç,ã,õ......'之外的所有角色。

使用正则表达式有一些最佳解决方案吗?我的实际正则表达式是(如Remove characters using Regex所示):

Regex regex = new Regex(@"[\W_]+");
string cleanText = regex.Replace(messyText, "").ToUpper();

只是强调,我只担心拉丁字符。

6 个答案:

答案 0 :(得分:7)

一个简单的选项是将接受的字符列入白名单:

string clean = Regex.Replace(messy, @"[^a-zA-z0-9!@#]+", "");

如果您要删除所有非ASCII字母但保留所有其他字符,可以使用character class subtraction

string clean = Regex.Replace(messy, @"[\p{L}-[a-zA-Z]]+", "");

它也可以写成更标准和更复杂的[^\P{L}a-zA-Z]+(或[^\Wa-zA-Z]),其中显示“选择所有的字符(不是字母或ASCII)字母)“,最后是我们正在寻找的字母。

您还可以考虑以下方法更有用:How do I remove diacritics (accents) from a string in .NET?

答案 1 :(得分:4)

这有用吗?

Regex regex = new Regex(@"[^a-zA-Z0-9_]");

答案 2 :(得分:4)

另一种选择可能是从Unicode转换为ASCII。这不会丢弃字符,而是将它们转换为? s。这可能比放弃它们更好(用作键)。

string suspect = "lição";
byte[] suspectBytes = Encoding.Convert(Encoding.Unicode, Encoding.ASCII, Encoding.Unicode.GetBytes(suspect));
string purged = Encoding.ASCII.GetString(suspectBytes);
Console.WriteLine(purged); // li??o

请注意,问号通常是唯一但不具代表性的字符,因此您可能会减少碰撞。

答案 3 :(得分:2)

目标应该是简单地包括ASCII字符A-Z和数字和标点符号。只需使用RegEx排除该范围之外的所有内容。

string clean = Regex.Replace(messy, @"[^\x20-\x7e]", String.Empty);

要清楚,我正在使用的正则表达式是:

[^\x20-\x7e]

你可能需要转义\字符 - 除了RegEx好友之外我还没有测试过这个:)

排除ASCII字符0x20和0x7e之外的所有内容,转换为ASCII范围十进制32-127。

祝你好运!

最佳,

-Auri

答案 4 :(得分:1)

我认为最好的正则表达式是使用:

[^\x00-\x80]

这是所有ASCII字符的否定。它匹配所有非ASCII字符:\x00\x80(128)是十六进制字符代码,-表示范围。 ^[内的]表示否定。

用空字符串替换它们,你应该拥有你想要的东西。它还使您免于担心标点符号等不是ASCII,并且可能导致微妙但令人讨厌(并且难以追踪)错误。

如果要将扩展ASCII集用作合法字符,可以说\xFF而不是\x80

答案 5 :(得分:0)

这对我更有用:

([\p{L}]+)