【问题标题】:How to use double brackets in a regular expression?如何在正则表达式中使用双括号?
【发布时间】:2012-08-29 19:30:01
【问题描述】:

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

/[[^abc]]/

/[^abc]/

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

【问题讨论】:

  • 我创建了expand-brackets,如果您有兴趣查看与 posix 字符类匹配的 javascript 实现

标签: ruby regex syntax brackets


【解决方案1】:

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">

【讨论】:

【解决方案2】:

'[[' 没有任何特殊含义。 [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

【讨论】:

  • 请注意,并非所有正则表达式风格都是如此。例如,Java 会将其视为一个只包含另一个字符类的字符类,因此[[^abc]][^abc] 实际上是相同的。
  • FWIW - Python 具有与上述答案相同的行为,不确定其他语言或它“应该”做什么,尽管我更喜欢@AlanMoore 提到的行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-13
  • 1970-01-01
  • 2021-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多