给定这样一个字符串:
a = 'Somewhere +in+ La-Mancha, in a |place| whose {name} I [do not care] to remember'
我想删除任何非单词和非空格字符。以下代码段按预期工作:
a.gsub(/[^\w\s]/,'')
# => "Somewhere in LaMancha in a place whose name I do not care to remember"
但是以下不起作用。
a.gsub(/[\W\S]/,'')
# => ""
理论上,这两个正则表达式是等效的,但它们的工作方式不同。有谁知道原因吗?
是否可以组合否定字符类?
最佳答案
正负字符类中原子之间的关系是不同的。在正字符类中,原子是或运算(匹配这个或那个),而在负字符类中,元素是与运算(不匹配这个和那个)。
所以,[\W\S]
匹配字母数字/下划线以外的字符,或者 - 如果找到 - 也匹配那些不等于空格的字符。 自\W
匹配空格和 \S
匹配任何非空格,这 [\W\S]
匹配任何字符。这就是为什么 a.gsub(/[\W\S]/,'')
返回空字符串。
至于[^\w\s]
,它匹配任何不是字母数字/下划线且不是空格的字符。因此,它匹配任何非单词字符且没有空白字符([\W&&[^\s]]
构造的同义词)。参见 rubular demo .
再举一个例子:
\W
是匹配所有非单词(或匹配“单词”以外的任何字符)字符的通用速记字符类。现在,我们要匹配除 ;
之外的所有非单词字符 。分号是非单词字符。我们该怎么办?我们可以使用具有相反类的否定字符类 \w
- [^\w]
- 并添加 ;
到它 -> [^\w;]
.这[^\w;]
将匹配任何非单词和非 ;
人物。
关于ruby - 在正则表达式中组合否定字符类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36497278/