2011-03-16 52 views
10

我正在開發一個葡萄牙語軟件,因此我的許多實體都有'maça'或'lição'這樣的名稱,我想將該實體用作資源鍵。所以我想保留除'ç,ã,õ....'以外的每個字符。使用正則表達式刪除所有獨佔拉丁字符

有一些使用正則表達式的最佳解決方案?我的實際正則表達式是(爲Remove characters using Regex建議):

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

只強調,我只是用拉丁字符擔心。

+1

標題寫着 「刪除所有拉丁字符」,是正確的? ''abçã12#$%'''怎麼辦? – Kobi 2011-03-16 19:35:35

+0

「abc」是什麼,所有拉丁字符。 – Tergiver 2011-03-16 19:40:07

+0

我的壞@Kobi,我改了標題 – Custodio 2011-03-16 19:44:18

回答

7

一個簡單的選擇是白名單中接受的字符:

string clean = Regex.Replace(messy, @"[^[email protected]#]+", ""); 

如果你想刪除所有非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?

+0

+1因爲我以前從來沒有見過字符類減法。神聖的煙霧,這很有用。這是隻在.NET? – 2011-03-16 19:49:27

+0

這就是我在想@Kobi。所有人物的想法減去拉丁獨家。 – Custodio 2011-03-16 19:52:07

+0

@Justin - 謝謝!這不僅僅是.Net(我在其他地方看到過,IIRC,儘管目前我無法在任何地方使用它,所以我可能在這裏是錯誤的),並且它根本沒有那麼有用 - 這個是我第一次考慮使用它。你可以用另一種方式用另一種方式來寫它,或者像'(?![a-zA-z])\ p {L}'(我可能在這裏忽略了這個明顯的選項......) – Kobi 2011-03-16 19:54:44

4

這是行不通的?

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

毆打:) – 2011-03-16 19:44:50

4

另一種選擇可能是從Unicode轉換爲ASCII。這不會刪除字符,而是將它們轉換爲'?'。這可能比放下它們更好(用作鍵)。

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 

請注意,問號通常是唯一的但不具有代表性的字符,因此您可能會減少衝突。

1

我認爲最好的正則表達式是使用:

[^\x00-\x80] 

這是所有ASCII字符的否定。它匹配所有非ASCII字符:\x00\x80(128)是十六進制字符代碼,而-表示範圍。 []中的^表示否定。

用空字符串替換它們,你應該有你想要的。它還可以讓你免於擔心標點符號等,它們不是ASCII碼,並且可能導致微妙但煩人的(並且很難追查)錯誤。

如果您想使用擴展ASCII集作爲合法字符,您可以說\xFF而不是\x80

+0

只需添加空格字符,並且工作正常。 – Custodio 2011-03-16 20:07:38

+0

但儘量保持代碼易讀,x00和x80可能是未來維護的恐懼點。 – Custodio 2011-03-16 20:09:20

+0

@Luís - 考慮添加一個友好的評論,在這種情況下,這裏有一個鏈接':)' – Kobi 2011-03-16 20:12:36

2

目標應該是簡單地包含ASCII字符A-Z和數字和標點符號。使用RegEx排除該範圍之外的所有內容。

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

要清楚,我用正則表達式是:

[^\x20-\x7e] 

您可能需要逃避\字符 - 我沒有任何東西測試這一點,但正則表達式的好友:)

排除ASCII字符0x20和0x7e之外的所有內容,這些字符轉換爲ASCII範圍十進制32-127。

祝你好運!

最佳,

-Auri

0

這是更有用的對我說:

([\p{L}]+) 
相關問題