我正在开发一个葡萄牙语软件,因此我的许多实体都有'maça'或'lição'等名称,我想将该实体用作资源键。所以我想保留除'ç,ã,õ......'之外的所有角色。
使用正则表达式有一些最佳解决方案吗?我的实际正则表达式是(如Remove characters using Regex所示):
Regex regex = new Regex(@"[\W_]+");
string cleanText = regex.Replace(messyText, "").ToUpper();
只是强调,我只担心拉丁字符。
答案 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}]+)