2010-01-28 14 views
11

Mam ciąg znaków, który może zawierać znaki specjalne, takie jak: $, (, @, #, itd. Potrzebuję być w stanie wykonywać wyrażeń regularnych na tym ciągu.Jak uniknąć specjalnych znaków w ciągu I interpolować do wyrażenia Perla?

Teraz, jeśli mój ciąg ma któryś z tych znaków, regex wydaje się być uszkodzony, ponieważ są to znaki zastrzeżone dla regex.

Czy ktoś zna dobrego podprogram że ucieknie ładnie któregokolwiek z tych znaków na mnie tak, że później mogę zrobić coś takiego:

$p_id =~ /^$key/ 
+0

Duplikat: http://stackoverflow.com/questions/2135519/why-does-my-regular-expression-fail- with-certain-substitutions –

+1

możliwy duplikat [Jak obsługiwać znaki specjalne w wyrażeniu Perl? ] (http://stackoverflow.com/questions/576435/how-do-i-handle-special-characters-in-a-perl-regex) – daxim

Odpowiedz

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

Co robią \ Q i \ E? – goe

+2

Cytat i końcowa. Oznacza to, że klucz $ jest traktowany jako ciąg znaków bez znaków specjalnych. – Steven

+1

@goe, oni cytują metaznaki. – daotoad

6

Z Twojego opisu brzmi jak masz go do tyłu . Nie musisz uciec od znaków na łańcuchu, na który się pasujesz ($ p_id), musisz uciec z łańcucha dopasowania "^ $ klucz".

Dane:

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

Zastosowanie:

$p_id =~ /^\$key/; 

lub

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

\ Q \ e para leczenia wszystko pomiędzy jako dosłownym. Innymi słowy, nie chcesz szukać zawartości zmiennej $ key, ale rzeczywisty ciąg "$ key". Pierwszy przykład po prostu ucieka z $.

Powiązane problemy