2011-06-20 36 views
8

Trong một số mã tôi đang duy trì, tôi đã tìm thấy các biểu hiện:gì D làm trong Perl biểu thức thông thường

$r->{DISPLAY} =~ s/\Device//s; 

gì làm tôi ngạc nhiên là nó phù hợp với cả hai thiết bị và thiết bị!

Tôi chưa tìm thấy bất kỳ đề cập nào về \ D trong tài liệu, chỉ \ d.

Ai đó có thể làm rõ xin vui lòng ...

+0

Bạn gần như chắc chắn muốn một kết hợp không phân biệt dạng chữ ('s/Device // si') thay vì sử dụng obfuscated của' \ D' ... – geoffspear

+1

Nó cũng hữu ích khi biết rằng bạn chạy 'perldoc perlre' trên dòng lệnh hoặc truy cập tại đây: http://perldoc.perl.org/perlre.html. – FMc

+2

Tôi gọi đây là cách sử dụng "không đúng" của '\ D' chứ không phải là sử dụng" obfuscated "... Regex đó cũng sẽ khớp với" kẽ hở "," Levice "và thậm chí" #evice ", không chỉ" thiết bị "và" Thiết bị ". –

Trả lời

19

\D là sự phủ định của \d, tức là nó phù hợp với bất cứ điều gì đó không phải là một chữ số.

+0

Cảm ơn, điều đó giải thích nó !! – Roger

+2

@Roger Nếu bạn thích câu trả lời của sepp2k, bạn nên nhấp vào dấu kiểm ở bên trái, để biểu thị rằng câu trả lời này đã trả lời câu hỏi của bạn. – TLP

+0

Đây chắc chắn là câu trả lời đúng, cảm ơn sepp2k – Roger

11

Trong regex đó, \D trông giống như lỗi đánh máy. Nó hoạt động cho cả hai số dD, chỉ vì nó khớp với bất kỳ ký tự nào không phải là chữ số (0-9).

Một regex thích hợp hơn (nếu mục đích là để phù hợp với "thiết bị" hoặc "thiết bị"), là:

s/(d|D)evice// # one way 
s/[dD]evice// # another way 

Tùy chọn s cũng là một chút kỳ quặc. Từ perldoc perlop

s Treat string as single line. (Make . match a newline) 

Và không có phù hợp như vậy xảy ra trong dòng đó.

+0

Có, tôi nghĩ rằng '\' là lỗi cắt và dán, vì khớp với Thiết bị đã được yêu cầu ... – Roger

+0

Lỗi sao chép/dán lạ .. nó dường như không thuộc về nó trong bất kỳ bối cảnh nào tôi có thể nghĩ đến, ngoại trừ có lẽ từ một đường dẫn cửa sổ, ví dụ "c: \ Thiết bị" ... – TLP

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