首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >正则表达式中的负字符类组合

正则表达式中的负字符类组合
EN

Stack Overflow用户
提问于 2016-04-08 10:26:20
回答 2查看 2.7K关注 0票数 2

给出这样的字符串:

代码语言:javascript
复制
a = 'Somewhere +in+ La-Mancha, in a |place| whose {name} I [do not care] to remember'

我想删除任何非单词和非空格字符。以下代码段按预期工作:

代码语言:javascript
复制
a.gsub(/[^\w\s]/,'')
# => "Somewhere in LaMancha in a place  whose name I do not care to remember"

但是下面这些都不起作用。

代码语言:javascript
复制
a.gsub(/[\W\S]/,'')
# => ""

理论上,这两个正则表达式是等价的,但它们的工作方式并不相同。有人知道原因吗?

是否有可能组合负面字符类?

EN

回答 2

Stack Overflow用户

发布于 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]是:非字字符或非空格字符.

它们是不同的。例如,一个非字字符和一个空格匹配第二个正则表达式,而不是第一个正则表达式。

是否有可能组合负面字符类?

是。字符类有交集运算符&&

代码语言:javascript
复制
/[\W&&\S]/

等于[^\w\s]

票数 5
EN

Stack Overflow用户

发布于 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;]将匹配任何非单词和非;字符.

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36497278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档