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字符的示例特别有趣。