正则表达式中的双方括号是什么意思?我对以下示例感到困惑:
/[[^abc]]/
/[^abc]/
我正在使用Rubular进行测试,但我没有发现双括号和单括号之间有任何区别。
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">
'[[' 没有任何特殊含义。 [xyz]
是一个字符类,将匹配单个x
,y
或z
. 克拉^
取所有不在括号中的字符。
为简单起见^
,您可以看到第一个左括号与第一个右括号匹配,第二个右括号被用作字符类的一部分。最后的右括号被视为要匹配的另一个字符。
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