给出这样的字符串:
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]/,'')
# => ""理论上,这两个正则表达式是等价的,但它们的工作方式并不相同。有人知道原因吗?
是否有可能组合负面字符类?
发布于 2016-04-08 10:32:09
理论上,这两个正则表达式是等价的。
不用谢。
这是基本的学校逻辑。
not (A or B) (或等效的(not A) and (not B))(not A) or (not B)是不一样的。特别是,
[^\w\s]是: not (单词字符或空格字符)。[\W\S]是:非字字符或非空格字符.它们是不同的。例如,一个非字字符和一个空格匹配第二个正则表达式,而不是第一个正则表达式。
是否有可能组合负面字符类?
是。字符类有交集运算符&&。
/[\W&&\S]/等于[^\w\s]。
发布于 2016-04-08 10:42:36
正、负特征类原子之间的关系是不同的。在正数中,原子是ORed (匹配这个或那个),在负字符类中,元素是ANDed (不匹配这个和那个)。
因此,[\W\S]匹配字母数字/下划线以外的字符,或者--如果找到--也匹配那些不等于空格的字符。由于\W 匹配空格,而 \S 匹配任何非空格,因此 [\W\S] 匹配任何字符。这就是为什么a.gsub(/[\W\S]/,'')返回空字符串的原因。
至于[^\w\s],它匹配的任何字符都不是字母数字/下划线,也不是空格。因此,它匹配任何非单词字符和空白字符( [\W&&[^\s]]构造的同义词)。见圆球演示。
再举一个例子
\W是一个通用的速记字符类,它匹配所有非单词(或者,匹配“word”以外的任何字符)字符。现在,我们想要匹配除;以外的所有非字字符.分号是一个非单词字符.我们该怎么办?我们可以在相反的类\w - [^\w]中使用否定式字符类,并将;添加到-> [^\w;]中。此[^\w;]将匹配任何非单词和非;字符.
https://stackoverflow.com/questions/36497278
复制相似问题