2

我正在编写一个正则表达式来挑选字符串中的标点符号,并且我得到了一些我没想到的行为:

ix = regexp('FGFR4','[~!@#$%^&*()-=+{}\|;:''",<.>/?\[]')
ix =

     [5]

ix = regexp('FGFR4','[~!@#$%^&*()-+{}\|;:''",<.>/?\[]') %note, the '=' is gone
ix =

     []

因此,'=' 似乎与数字 4 匹配。我期望它仅匹配 '=' 符号,如下所示:

ix = regexp('FOO=SPAM','[~!@#$%^&*()-=+{}\|;:''",<.>/?\[]')
ix =

     [4]

这里发生了什么?

4

1 回答 1

4

问题不在于它,=-在于它的前面。它创建一个范围内的所有字符 from )to =(按 ASCII 顺序)。如果您删除 , 这不是问题的原因=是它+4ASCII 顺序出现,因此范围不包括4(实际上它只包括),*+, 反正你有*,这不会有关系。

三种解决方案:

  1. 转义连字符:

    [~!@#$%^&*()\-=+{}\|;:''",<.>/?\[]
    
  2. 或将其放在字符类的末尾:

    [~!@#$%^&*()=+{}\|;:''",<.>/?\[-]
    
  3. 除非你想确保你完全使用这组字符......所以如果你可以匹配任何不是空格、字母或数字(或下划线)的东西,你也可以使用这个:

    [^\w\s]
    

    匹配任何非下划线、非字母、非数字、非空白字符。

于 2012-11-14T18:46:32.543 回答