8

正規表現で二重角かっこはどういう意味ですか?私は次の例について混乱しています:

/[[^abc]]/

/[^abc]/

Rubularを使用してテストしていましたが、二重括弧を使用したものと単一括弧を使用したものの間に違いは見られませんでした。

4

2 に答える 2

9

Posix 文字クラスは、次の[:alpha:]ような正規表現内で使用される記法を使用します。

/[[:alpha:][:digit:]]/

上記のリンクの Posix 情報にアクセスするには、下にスクロールする必要があります。ドキュメントから:

POSIX ブラケット式も文字クラスに似ています。これらは、非ASCII文字を含むという追加の利点とともに、上記の移植可能な代替手段を提供します。たとえば、/\d/ は ASCII 10 進数 (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">
于 2012-09-05T07:16:51.970 に答える
4

'[['には特別な意味はありません。 [xyz]は文字クラスであり、単一xの、yまたはに一致しzます。カラット^は、括弧内にないすべての文字を取ります。

^簡単にするために削除すると、最初の開いたブラケットが最初の閉じたブラケットと一致し、2番目の閉じたブラケットが文字クラスの一部として使用されていることがわかります。最後の閉じ括弧は、一致する別の文字として扱われます。

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
于 2012-09-05T06:19:17.037 に答える