8

正则表达式中的双方括号是什么意思?我对以下示例感到困惑:

/[[^abc]]/

/[^abc]/

我正在使用Rubular进行测试,但我没有发现双括号和单括号之间有任何区别。

4

2 回答 2

9

Posix 字符类使用[:alpha:]符号,它在正则表达式中使用,例如:

/[[:alpha:][:digit:]]/

您需要向下滚动以获取上述链接中的 Posix 信息。从文档:

POSIX 括号表达式也类似于字符类。它们为上述内容提供了一种可移植的替代方案,另外还有一个好处是它们包含非 ASCII 字符。例如,/\d/ 仅匹配 ASCII 十进制数字 (0-9);而 /[[:digit:]]/ 匹配 Unicode Nd 类别中的任何字符。

/[[:alnum:]]/ - Alphabetic and numeric character
/[[:alpha:]]/ - Alphabetic character
/[[:blank:]]/ - Space or tab
/[[:cntrl:]]/ - Control character
/[[:digit:]]/ - Digit
/[[:graph:]]/ - Non-blank character (excludes spaces, control characters, and similar)
/[[:lower:]]/ - Lowercase alphabetical character
/[[:print:]]/ - Like [:graph:], but includes the space character
/[[:punct:]]/ - Punctuation character
/[[:space:]]/ - Whitespace character ([:blank:], newline,
carriage return, etc.)
/[[:upper:]]/ - Uppercase alphabetical
/[[:xdigit:]]/ - Digit allowed in a hexadecimal number (i.e., 0-9a-fA-F)

Ruby 还支持以下非 POSIX 字符类:

/[[:word:]]/ - A character in one of the following Unicode general categories Letter, Mark, Number, Connector_Punctuation
/[[:ascii:]]/ - A character in the ASCII character set
# U+06F2 is "EXTENDED ARABIC-INDIC DIGIT TWO"

/[[:digit:]]/.match("\u06F2")    #=> #<MatchData "\u{06F2}">
/[[:upper:]][[:lower:]]/.match("Hello") #=> #<MatchData "He">
/[[:xdigit:]][[:xdigit:]]/.match("A6")  #=> #<MatchData "A6">
于 2012-09-05T07:16:51.970 回答
4

'[[' 没有任何特殊含义。 [xyz]是一个字符类,将匹配单个x,yz. 克拉^取所有不在括号中的字符。

为简单起见^,您可以看到第一个左括号与第一个右括号匹配,第二个右括号被用作字符类的一部分。最后的右括号被视为要匹配的另一个字符。

irb(main):032:0> /[[abc]]/ =~ "[a]"
=> 1
irb(main):033:0> /[[abc]]/ =~ "a]"
=> 0

在某些情况下,这似乎与您的原始结果相同

irb(main):034:0> /[abc]/ =~ "a]"
=> 0
irb(main):034:0> /[abc]/ =~ "a"
=> 0

但这只是因为您的正则表达式不是在寻找完全匹配的。

irb(main):036:0> /^[abc]$/ =~ "a]"
=> nil
于 2012-09-05T06:19:17.037 回答