如何在正则表达式中使用双括号?

时间:2012-09-05 06:02:05

标签: ruby regex syntax brackets

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

/[[^abc]]/

/[^abc]/

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

2 个答案:

答案 0 :(得分:8)

Posix character classes使用[: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">

答案 1 :(得分:4)

'[['没有任何特殊含义。 [xyz]是一个字符类,将匹配单个xyz。克拉^将所有字​​符都放在括号中。

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

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