Ruby 在正则表达式中组合负字符类

Ruby 在正则表达式中组合负字符类,ruby,regex,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

给定如下字符串:

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]/,'')
# => ""
理论上,两个正则表达式是等价的,但它们的工作方式不同。有人知道原因吗

是否可以合并负面字符类

理论上,这两个正则表达式是等价的

一点也不

这是基本的学校逻辑

  • 非(A或B)
    (或相当于
    (非A)和(非B)
  • (非A)或(非B)
它们是不同的。特别是,

  • [^\w\s]
    是:非(单词字符或空格字符)
  • [\W\S]
    是:非单词字符或非空格字符
他们是不同的。例如,非单词且为空格的字符与第二个正则表达式匹配,但与第一个正则表达式不匹配

是否可以合并负面字符类

对。字符类有交集操作符
&&

/[\W&&\S]/

相当于正负字符类中原子之间的关系不同。在正数中,原子是或的(匹配这个或那个),而在负数字符类中,元素是和的(不匹配这个和那个)

因此,
[\W\S]
匹配字母数字/下划线以外的字符,或者-如果找到-也匹配那些不等于空白的字符由于
\W
匹配空白且
\S
匹配任何非空白,因此该
[\W\S]
匹配任何字符。这就是
a.gsub(/[\W\S]/,“”)
返回空字符串的原因

至于
[^\w\s]
,它匹配任何非字母数字/下划线且非空白的字符。因此,它匹配任何非单词字符和空白字符(与
[\W&&[^\s]]
构造的同义词)。看

再举一个例子:


\W
是一个通用速记字符类,它匹配所有非单词字符(或匹配除“单词”以外的任何字符)。现在,我们要匹配除
之外的所有非单词字符。分号是非单词字符。我们该怎么办?我们可以将求反字符类与相反的类
\w
-
[^\w]
-一起使用,并添加
到它->
[^\w;]
。此
[^\w;]
将匹配任何非单词和非
字符

我认为这是一个复杂的方式来理解像这样的负面人物类。我的理解是,它总是
,但否定的
^
适用于
[]
@sawa的整个内容:让我们把这留给用户/未来的读者,什么是复杂的,什么不是。事实上,我不同意这是基础学校水平。但我给了+1,因为我指出
[\W\S]
匹配任何字符,我忘了指出。至少在我的国家,德摩根定律是在四年级教授的(使用集合,但不使用逻辑符号)。在十年级的时候,这本书就有了完整的符号。非常好的解释,谢谢。我很少使用这些类,也不记得了。当然,/[\W&&\S]/是我一直在寻找的表达式,但讨论非常精彩:)我不熟悉角色类中的
&&
,所以我做了一些探索,然后发现了。我发现涉及Unicode字符的示例特别有趣。