2012-09-05 21 views
8

Çift köşeli parantez ifadeleri ne anlama gelir? Aşağıdaki örnekler hakkında karıştı:Düzenli ifadede çift parantez nasıl kullanılır?

/[[^abc]]/ 

/[^abc]/ 

Ben Rubular kullanarak test ediyordum, ama çift parantez ve tek parantez ile bir arasında herhangi bir fark görmedik.

+0

yarattığım [genişletmek-parantez] (https://www.npmjs.com/package/ genişletilmiş parantezler), posix karakter sınıfları – jonschlinkert

cevap

8

Posix character classes kullanımı gibi ifadenin içinde kullanılan bir [:alpha:] notasyonu,: Yukarıda linkte Posix bilgilere ulaşmak için bir yol aşağı kaydırmak gerekir

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

. Belgelerden aynı şekilde karakter sınıflarına da benzerler:

. ASCII olmayan karakterleri kapsayacak ek yarar ile, yukarıdakilere taşınabilir bir alternatif sağlarlar. Örneğin,/\ d/yalnızca ASCII ondalık basamaklarıyla eşleşir (0-9); oysa/[[: digit:]]/Unicode Nd kategorisindeki herhangi bir karakterle eşleşir.

/[[: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 aşağıdaki POSIX olmayan karakter sınıflarını destekler

:

/[[: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"> 
+0

Bu cevap, "Karakter Sınıfları" altında, [Yığın Taşması Normal İfadesi SSS] 'ne (http://stackoverflow.com/a/22944075/2736496) eklendi. – aliteralmind

4

'[[' herhangi bir özel anlamı yok. [xyz] bir karakter sınıftır ve tek bir x, y veya z eşleşir. Karatta ^, parantez içinde olmayan tüm karakterleri alır.

Basitlik için ^ kaldırılıyor, ilk açık desteğin ilk yakın braketle eşleştirildiğini ve ikinci kapalı desteğin karakter sınıfının bir parçası olarak kullanıldığını görebilirsiniz. Son yakın parantez, eşleştirilecek başka bir karakter olarak ele alınır.

irb(main):032:0> /[[abc]]/ =~ "[a]" 
=> 1 
irb(main):033:0> /[[abc]]/ =~ "a]" 
=> 0 

Bu, bazı durumlarda

irb(main):034:0> /[abc]/ =~ "a]" 
=> 0 
irb(main):034:0> /[abc]/ =~ "a" 
=> 0 

Orijinal aynı sonucu gibi görünüyor Ama bu düzenli ifade tam bir eşleşme bakmıyor çünkü.

irb(main):036:0> /^[abc]$/ =~ "a]" 
=> nil 
+1

ile eşleşmenin javascript uygulamasını görmek istiyorsanız, bunun tüm regex tatları için geçerli olmadığını unutmayın. Örneğin, Java bunu başka bir karakter sınıfından başka bir şey içermeyen bir karakter sınıfı olarak ele alır, dolayısıyla [[^ abc]] ve '[^ abc]' etkin bir şekilde aynıdır. –

+0

FWIW - Python, @AlanMoore'un bahsettiği davranışı tercih etmeme rağmen, diğer dilleri veya ne yapması gerektiğini bilmeden, yukarıdaki cevaba eşit davranır. – dfb