Что означают двойные квадратные скобки в регулярном выражении? Я смущен следующими примерами:
/[[^abc]]/
/[^abc]/
Я тестировал, используя Rubular, но я не видел никакой разницы между тем, у кого есть двойные скобки и отдельные скобки.
Что означают двойные квадратные скобки в регулярном выражении? Я смущен следующими примерами:
/[[^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