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

8
双方括号在正则表达式中代表什么?以下示例让我感到困惑:

[[a-z]]

[[^a-z]]

[[[:digit:]]]

[[^[:digit:]]]

/[[^abc]]/

/[^abc]/

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


我创建了expand-brackets,如果你有兴趣看到一个使用posix字符类进行匹配的javascript实现。 - jonschlinkert
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">

此答案已添加到Stack Overflow正则表达式FAQ,位于“字符类”。 - aliteralmind
还有单词边界? [[:<:]][[:>:]] - Rick James

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

1
请注意,这并不适用于所有正则表达式语言。例如,在Java中,它将被视为只包含另一个字符类的字符类,因此[[^abc]][^abc]实际上是相同的。 - Alan Moore
就此而言,Python具有与上述答案等效的行为,不确定其他编程语言或应该做什么,但我更喜欢@AlanMoore提到的行为。 - dfb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接