我正在写一个正则表达式来挑选字符串中的标点符号,并且我得到了一些我不期望的行为:
ix = regexp('FGFR4','[~!@#$%^&*()-=+{}\|;:''",<.>/?\[]')
ix =
[5]
ix = regexp('FGFR4','[~!@#$%^&*()-+{}\|;:''",<.>/?\[]') %note, the '=' is gone
ix =
[]
所以似乎'='与数字4匹配。我期望它只是匹配'='符号:
ix = regexp('FOO=SPAM','[~!@#$%^&*()-=+{}\|;:''",<.>/?\[]')
ix =
[4]
这里发生了什么?
答案 0 :(得分:4)
问题不在于=
,而在于-
。它会创建从)
到=
的所有字符范围(按ASCII顺序)。如果删除=
,这不是问题的原因是+
以{1}}出现在ASCII顺序中,因此范围不包括4
(实际上它只包含4
,)
和*
,因为无论如何都有+
,这绝不重要。
三种解决方案:
逃脱连字符:
*
或将其放在角色类的末尾:
[~!@#$%^&*()\-=+{}\|;:''",<.>/?\[]
除非你想确保你使用这组字符...所以如果你可以匹配任何不是空格,字母或数字(或下划线)的东西,那么你也可以这样使用:
[~!@#$%^&*()=+{}\|;:''",<.>/?\[-]
匹配任何非下划线,非字母,非数字,非空白字符。