ruby - 在正则表达式中组合否定字符类

标签 ruby regex

给定这样一个字符串:

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/

相关文章:

ruby - 递归获取目录的大小

ruby-on-rails - Rails Association 如果 bool 值为真

javascript - 字符串中与“\”反斜杠匹配的Javascript

javascript - 使用 vim 正则表达式匹配多行 javascript 导入

javascript - 匹配括号中是否包含文本 - 正则表达式

regex - Powershell正则表达式匹配字符串末尾的vhd或vhdx

mysql - rails : Sidekiq cannot find the created record

ruby - 在主要元素为零的次要元素上对多维数组进行排序

ruby - 如何显示方法参数中的 nil?

python - 正则表达式返回 <_s 而不是十进制值