我知道我可以使用POSIX括号表达式[[:space:]]
搜索与空格匹配的内容。我可以使用POSIX括号表达式搜索与空格不匹配的内容吗?特别是,它应匹配的字符包括字母和括号((
)。
[[:graph:]]
看起来有些模糊:
[[:graph:]]
- 非空白字符(不包括空格,控制字符等)
答案 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">