Matlab - 如何替换向量中的所有特殊字符?

8

能否通过正则表达式替换Matlab向量中的所有特殊字符呢?

谢谢。

*编辑:*

谢谢你们的回答。我想要实现以下功能。我有一个包含小说几段的文本文件,我已将此文件读入向量中。

fileText = ['Token1,' 'token_2' 'token%!3'] 等等。

在这种情况下,_ % ! 是特殊字符,我想用空格('')替换它们。这可以通过正则表达式实现吗?我可以用JavaScript做到这一点,但无法在Matlab中使其工作。

谢谢。


你能否更清楚地解释一下你的意思?或者给我们举个例子吗? - High Performance Mark
“特殊字符”是什么意思? - gnovice
6
根据您所说的“特殊字符”的含义,您可能希望使用函数ISSTRPROP:http://www.mathworks.com/help/techdoc/ref/isstrprop.html 它可以测试字母、数字、空格、控制字符等。 - Amro
感谢回复,请查看编辑。 - user338195
1个回答

23
如果您所说的“特殊字符”是指较少使用的Unicode字符,比如¥¼,那么您可以使用REGEXPREP函数或设置比较函数,比如ISMEMBER(如果需要,您可以先使用DOUBLE函数将字符转换为其等效的整数代码)。以下是一些示例,从字符串中删除除标准英文字母(小写和大写)以外的所有字符:
str = ['ABCDEFabcdefÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐ'];   %# A sample string
str = regexprep(str,'[^a-zA-Z]','');      %# Remove characters using regexprep
str(~ismember(str,['A':'Z' 'a':'z'])) = '';  %# Remove characters using ismember
                                             %#   (as suggested by Andrew)
str(~ismember(double(str),[65:90 97:122])) = '';  %# Remove characters based on
                                                  %#   their integer code

以上所有选项都会产生相同的结果:

str =

ABCDEFabcdef


编辑:

针对问题中更新后的具体示例,以下是如何使用 REGEXPREP 将所有不是 a-zA-Z0-9 的字符替换为空格的方法:

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

这可能比尝试编写正则表达式来匹配每个单独的“特殊”字符更容易,因为可能会有许多这样的字符。但是,如果您确信只有_%!这些特殊字符,那么以下方法应该可以实现与上述方法相同的效果:

str = regexprep(str,'[_%!]','');

另外,正如Amro的评论中提到的那样,您还可以使用ISSTRPROP函数将所有非字母数字字符替换为空格,方法如下:

str(~isstrprop(str,'alphanum')) = '';

2
+1. 注意,65:122包括非字母字符,如[ \ ] `。(执行“disp(char(65:122))”进行确认。)无需转换为double:如果两个输入都是chars而不是cellstrs,则ismember()按字符操作。因此,“ismember(str, ['A':'Z' 'a':'z'])”也可以工作,并且在我看来比使用数字字符代码更易读。 - Andrew Janke
@Andrew:你说得对,我忘记把范围分成几部分了。另外,在字符串上直接使用ISMEMBER的建议很好。我没有意识到像'A':'Z'这样的东西会保持为字符数组而不是自动转换为double。 - gnovice
我认为 regexprep 是我需要的。我构建了一个包含所有特殊字符的正则表达式,而不是使用 '[A-Za-z]' 。但这对我没有用。我将在一分钟内运行您的代码。 - user338195

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接