2012-10-07 215 views
3

如何用等同替換下列特殊字符?用等價替換特殊字符

元音:ÁÉÍÓÚáéíóú分別由AEIOUaeiou。和N.

表達字母N:

str = regexprep(str,'[^a-zA-Z]',''); 

將刪除所有人物非在字母表,但我怎麼跟喜歡的東西等同替換上面顯示?

感謝

回答

5

你可以寫一個系列的正則表達式像:

s = regexprep(s,'(?:À|Á|Â|Ã|Ä|Å)','A') 
s = regexprep(s,'(?:Ì|Í|Î|Ï)','I') 

等了重音符號的其餘部分...(對於上/下例)

警告:即使對於拉丁字母表的小子集,也有這麼多variations


一個更簡單的例子:

chars_old = 'ÁÉÍÓÚáéíóú'; 
chars_new = 'AEIOUaeiou'; 

str = 'Ámró'; 
[tf,loc] = ismember(str, chars_old); 
str(tf) = chars_new(loc(tf)) 

的字符串之前:

>> str 
str = 
Ámró 

後:

>> str 
str = 
Amro 
+0

感謝@Amro,其實我只是用西班牙語集工作,所以特殊字符僅僅是如上圖所示。沒有更簡單的解決方案嗎?像PHP的str_replace,你可以傳遞一個包含等價數組作爲數組參數的數組? –

+0

另一種可能性是使用Perl(這是[可用](http://www.mathworks.com/help/matlab/ref/perl.html)到MATLAB)與[Text :: Unidecode](http:///search.cpan.org/perldoc/Text::Unidecode)。這是一個非常強大的解決方案,它執行有趣的事情,如從Unicode到ASCII的音譯。它已被移植到Python,Java等其他語言。(我過去曾使用Python端口) – Amro

+0

@JorgeZapata:我添加了一個更簡單的示例。 'chars_old'中的每個字符都被替換爲'chars_new'中的相應字符。你可以使用波形符與列表中的相同方式添加N: – Amro

5

以下代碼標準化所有音調符號的字符,即AAO。

function inputWash { 
    param(
     [string]$inputString 
    ) 
    [string]$formD = $inputString.Normalize(
      [System.text.NormalizationForm]::FormD 
    ) 
    $stringBuilder = new-object System.Text.StringBuilder 
    for ($i = 0; $i -lt $formD.Length; $i++){ 
     $unicodeCategory = [System.Globalization.CharUnicodeInfo]::GetUnicodeCategory($formD[$i]) 
     $nonSPacingMark = [System.Globalization.UnicodeCategory]::NonSpacingMark 
     if($unicodeCategory -ne $nonSPacingMark){ 
      $stringBuilder.Append($formD[$i]) | out-null 
     } 
    } 
    $string = $stringBuilder.ToString().Normalize([System.text.NormalizationForm]::FormC) 
    return $string.toLower() 
} 
Write-Host inputWash("ÖÄÅÑÜ"); 

oaanu 

Ommit .toLower()如果你不希望這樣的功能