2010-11-03 44 views
12

Trong một cuộc phỏng vấn gần đây tôi đã được yêu cầu giải mã regex nàyCụm từ thông dụng này có ý nghĩa gì?

^\^[^^] 

bạn có thể vui lòng giúp tôi với nó. Ngoài ra, vui lòng cung cấp một số liên kết nơi tôi có thể học regex để phỏng vấn.

+2

Sẽ rõ ràng hơn nếu bạn đăng biểu thức chính quy thực tế, không phải chuỗi Java với các bbaacckkssllllaasshheesses đau đớn và đôi khi lừa dối của nó. – tchrist

+1

@tchrist - tại sao? anh ta nói rằng ** chuỗi ký tự ** này đã được trao cho anh ta trong một cuộc phỏng vấn, một cuộc phỏng vấn liên quan đến Java, tôi đoán, nhìn vào thẻ. (BTW - thẻ regex đã được thêm bởi người khác, ban đầu nó đã được gắn thẻ chỉ Java) –

+1

@Andreas_D, tôi ghét phải thừa nhận đã bao nhiêu lần tôi đã sửa đổi một regex Java vì vấn đề dấu gạch chéo ngược. Bây giờ tôi đọc chúng từ một tập tin đạo cụ hoặc như một đối số dòng lệnh để (cố gắng) tránh được vấn đề. Mặc dù vậy, có một sự khác biệt lớn giữa một chữ Java được sử dụng như một regex và một regex thực tế. Nó giống như chiến đấu với vỏ, nhưng tệ hơn. – tchrist

Trả lời

30

Nó phù hợp với chuỗi bắt đầu với ^ tiếp theo bất kỳ nhân vật khác hơn^.

Vì vậy, nó sẽ phù hợp:

^foo 
^b 

nhưng không

foo 
^^b 

Giải thích:

Caret (^) là một nhân vật meta regex với hai ý nghĩa khác nhau:

Bên ngoài lớp nhân vật (sử dụng lần đầu trong regex của bạn) nó hoạt động như bắt đầu neo.

Bên lớp nhân vật nó hoạt động như negatornếu sử dụng như là ký tự đầu tiên của lớp nhân vật (sử dụng 3 trong regex của bạn).

Trước một regex với \ thoát khỏi nó (làm cho nó không đặc biệt). Việc sử dụng thứ hai của ^ trong regex của bạn được thoát và nó khớp với một chữ số ^ trong chuỗi.

Bên trong một lớp nhân vật một ^ đó là không các ký tự đầu tiên của lớp nhân vật được xử lý theo nghĩa đen. Vì vậy, việc sử dụng thứ 4 trong regex của bạn là một ^ theo nghĩa đen.

Một số ví dụ khác để làm cho nó rõ ràng:

  • ^a                  : Trận chuỗi bắt đầu với a
  • ^ab              : Những Trận Đấu chuỗi đầu với a Tiếp theo b
  • [a]              : Trận một chuỗi mà có a
  • [^a]          : Trận một chuỗi mà không có một a
  • ^a[^a]: Ma tches a string bắt đầu bằng số a theo sau là bất kỳ ký tự nào khác ngoài a.
+1

Đó là sự thật nếu bạn giả định regex này là bên trong dấu ngoặc kép. Nếu không, nó sẽ là chữ '\'. –

+2

@Matt: Tôi giả định rằng vì thẻ java. – mkb

+3

@Matt, tôi nghĩ rằng đó là một giả định an toàn cho thực tế là nếu dấu gạch chéo ngược nghĩa đen có nghĩa là, regex sẽ không bao giờ khớp với bất kỳ chuỗi nào. –

2

trận đấu đầu dòng hoặc chuỗi theo sau là một literal \ tiếp theo là đầu dòng hoặc chuỗi tiếp theo bất kỳ nhân vật đó không phải là một không gian, trở lại hoặc ký tự dòng mới

+0

Đây là trang web phổ biến để tìm hiểu regex: http://www.regular-expressions.info/tutorial.html –

+0

Điều đó sai: bạn không thể có hai dấu đầu dòng/chuỗi thông qua '^' trừ khi bạn ở Chế độ '(? m)'. Câu trả lời rõ ràng nhất là nó phù hợp với các dòng bắt đầu bằng dấu mũ theo sau bởi bất kỳ ký tự không có dấu gạch ngang nào, nhưng điều này rất khó để nói bởi vì các dấu gạch chéo Java stooopid. – tchrist

+0

Tôi đã không nói nó là chính xác hoặc sẽ phù hợp với bất cứ điều gì. Tôi chỉ nói những gì nó nói. –

2

Đầu tiên ^ là sự bắt đầu của dòng.

Điều thứ hai là một ký tự chữ của ^ (\ là để thoát khỏi ý nghĩa thông thường khác của ^)

Người thứ ba là để nói

một lớp học của các nhân vật trong đó không bao gồm ký tự ^

Một số ví dụ để hiển thị bằng Ruby:

ruby-1.9.2-p0 > "hello" =~ /^h/ # it found a match at position 0 
=> 0 

ruby-1.9.2-p0 > "hello" =~ /^e/ # nil means can't find it 
=> nil 

ruby-1.9.2-p0 > "he^llo" =~ /\^/ # found at position 2 
=> 2 

ruby-1.9.2-p0 > "he^llo"[/[^^]*/] # anything repeatedly but not including the^character 
=> "he" 
+1

Câu trả lời hay không. – aioobe

+0

@ 動靜 能量 - bạn bỏ qua "chữ cái thứ hai" trong ví dụ của bạn - nó sẽ chỉ khớp nếu các chuỗi bắt đầu bằng '^'. Và '^' này là một phần của trận đấu ("^ hel^lo" -> "^ hel") –

+0

trường hợp thứ ba trong ví dụ này là để hiển thị kết hợp của chữ '^' ... là ý của bạn ? –

3

Tôi đang thử nghiệm regex này here tuy nhiên nó có vẻ không hợp lệ.
Đầu tiên ^ biểu thị sự bắt đầu của dòng.
\ đầu tiên thoát sau \.
Vì vậy, dấu "^" thứ hai không được thoát Cuối cùng dấu mũ đầu tiên bên trong dấu ngoặc vuông [^ hoạt động như phủ định và số thứ hai ^] không bị thoát do không hợp lệ.

IMHO đúng regexp phải là ^\^[^\^]
Các bạn vui lòng xác nhận.Rất cám ơn

+2

Tôi nghĩ rằng có một giả định ngầm rằng đây là bên trong dấu ngoặc kép, do đó, hai dấu gạch chéo ngược là cần thiết để thoát khỏi dấu mũ thứ hai. –

+0

Cảm ơn vì điều đó, chỉ cần đảm bảo – Philar

Các vấn đề liên quan