2012-10-07 175 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()如果你不希望这样的功能