我可以否定POSIX括号表达式吗?

时间:2017-03-08 22:35:18

标签: regex posix

我知道我可以使用POSIX括号表达式[[:space:]]搜索与空格匹配的内容。我可以使用POSIX括号表达式搜索与空格不匹配的内容吗?特别是,它应匹配的字符包括字母和括号(()。

[[:graph:]]看起来有些模糊:

  

[[:graph:]] - 非空白字符(不包括空格,控制字符等)

3 个答案:

答案 0 :(得分:3)

好吧,如果

'foo bar'[ /[[:space:]]/ ] # => " "

匹配一个空格,为什么这不起作用?

'foo bar'[ /[^[[:space:]]]/ ] # => "f"

例如,像这样:

'foo bar'.scan(/[^[[:space:]]]+/) # => ["foo", "bar"]

记住[[:space:]]是一个字符类很重要,就像\s\d或它们的否定版本一样。由于\S类似于[^\s],我们可以使用[^[[:space:]]]

  

我认为应该是[^ [:space:]],因为[:space:]是在集合符号[...]内扩展的内容。

我使用的是[[...]]表单,因为Regexp中记录了这些内容。

为清楚起见,以下是一些不使用文档中所示的双括号的示例,而是遵循以下注释:

'foo bar'[ /[[:space:]]/    ]# => " "
'foo bar'[ /[^[:space:]]/   ]# => "f"
'foo bar'[ /[^[[:space:]]]/ ]# => "f"

请注意,这不起作用:

'foo bar'[ /[:space:]/      ]# => "a"
正则表达式引擎将

/[:space:]/解释为:

/[:space]/ 

是常规字符集,而不是元表单。这就是为什么它与" foo bar"中的'a'匹配。

答案 1 :(得分:3)

你在这里混淆了两件事:bracket expression and a POSIX character class。外部[...]是一个括号表达式,可以使用紧跟在^之后的[来否定它。 POSIX字符类是[: + name + :]构造,仅适用于括号表达式。

因此,在您的情况下,[[:space:]]模式是一个括号表达式,只包含一个与空格匹配的POSIX字符类:

  • [ - 打开括号表达式
    • [:space:] - 空格的POSIX字符类
  • ] - 括号表达式的右括号。

要取消它,只需像通常的NFA character classes ^一样添加[^[:space:]]

注意我故意区分术语“括号表达式”,“POSIX字符类”和“字符类”,因为POSIX和常见的NFA正则表达式世界遵循不同的术语。

答案 2 :(得分:0)

似乎这种变化也有诀窍:

/[[:^alpha:]]+/.match("ab12")

结果:

#<MatchData "12">