2010-01-28 28 views
11

Tôi có một chuỗi có thể chứa các ký tự đặc biệt như: $, (, @, #, vv Tôi cần có thể thực hiện cụm từ thông dụng trên chuỗi đó.Làm cách nào để thoát khỏi các ký tự đặc biệt trong một chuỗi mà tôi nội suy thành một regex Perl?

Ngay bây giờ nếu chuỗi của tôi có bất kỳ ký tự nào trong số các ký tự này thì regex có vẻ vỡ vì đây là các ký tự dành riêng cho regex.

Không ai biết một chương trình con tốt mà có thể thoát khỏi độc đáo bất kỳ của những nhân vật này đối với tôi để sau này tôi có thể làm một cái gì đó như:

$p_id =~ /^$key/ 
+0

Nhân bản: http://stackoverflow.com/questions/2135519/why-does-my-regular-expression-fail-with-certain-substitutions –

+1

bản sao có thể có của [Làm cách nào để xử lý các ký tự đặc biệt trong regex Perl? ] (http://stackoverflow.com/questions/576435/how-do-i-handle-special-characters-in-a-perl-regex) – daxim

Trả lời

20
$p_id =~ /^\Q$key\E/; 
+0

\ Q và \ E làm gì? – goe

+2

Trích dẫn và kết thúc. Nó có nghĩa là $ key được coi là một chuỗi không có ký tự đặc biệt. – Steven

+1

@goe, họ trích dẫn các siêu ký tự. – daotoad

6

Từ mô tả của bạn, có vẻ như bạn có nó ngược . Bạn không cần phải thoát khỏi các ký tự trên chuỗi bạn đang đối sánh trên ($ p_id), bạn cần phải thoát khỏi chuỗi kết hợp của bạn '^ $ key'.

Given:

$p_id = '$key$^%*&#@^&%$blah!!'; 

Sử dụng:

$p_id =~ /^\$key/; 

hoặc

$p_id =~ /^\Q$key\E/; 

Các \ Q, \ E cặp đối xử với tất cả mọi thứ ở giữa là chữ. Nói cách khác, bạn không muốn tìm nội dung của biến $ key, nhưng chuỗi thực tế '$ key'. Ví dụ đầu tiên chỉ đơn giản là thoát khỏi $.

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