2013-02-12 11 views
15

मैं कुछ स्ट्रिंग्स में एक रेगेक्स अभिव्यक्ति प्रतिस्थापन बनाना चाहता हूं, और इसलिए इन स्ट्रिंग को रेगेक्स में रखने से पहले बचने की आवश्यकता है, इसलिए कि अगर स्ट्रिंग के लिए खोज में रेगेक्स वर्ण होते हैं तो यह अभी भी काम करता है।क्या रेगेक्स वर्णों के लिए स्ट्रिंग से बचने के लिए कोई आर फ़ंक्शन है

कुछ भाषाओं में ऐसे फ़ंक्शन हैं जो आपके लिए यह करेंगे (उदा। पायथन re.escape: https://stackoverflow.com/a/10013356/1900520)। क्या आर में ऐसा कोई कार्य है?

उदाहरण के लिए (समारोह बना हुआ):

x = "foo[bar]" 
y = escape(x) # y should now be "foo\\[bar\\]" 
+0

क्या आप एक उदाहरण स्ट्रिंग जोड़ सकते हैं और आप आउटपुट को किस तरह दिखाना चाहते हैं? –

+3

अधिकांश नियमित अभिव्यक्ति कार्यों में 'निश्चित' नामक एक पैरामीटर होता है जो TRUE पर सेट होने पर पैटर्न को मिलान करने का कारण बनता है। – Dason

+0

यह अच्छा नहीं है - मैं उपयोगकर्ता द्वारा दिए गए इनपुट से एक रेगेक्स बनाना चाहता हूं - इसलिए मुझे इनपुट को "sanitize" करने की आवश्यकता है लेकिन फिर भी regex का उपयोग करें। – Corone

उत्तर

13

मैं पर्ल के quotemeta समारोह के एक अनुसंधान संस्करण में लिखा है:

library(stringr) 
quotemeta <- function(string) { 
    str_replace_all(string, "(\\W)", "\\\\\\1") 
} 

मैं हमेशा regexps की पर्ल स्वाद का उपयोग करें, तो यह मेरे लिए काम करता है। मुझे नहीं पता कि यह आर

में "सामान्य" regexps के लिए काम करता है संपादित करें: मुझे यह बताते हुए स्रोत मिला कि यह क्यों काम करता है। यह Quoting Metacharacters section of the perlre manpage में बताया गया है:

यह एक बार अक्षम या एक स्ट्रिंग है कि आप एक पैटर्न के लिए उपयोग करना चाहते हैं में नियमित अभिव्यक्ति अक्षरों से परे का विशेष अर्थ उद्धृत करने के लिए एक आम मुहावरा में इस्तेमाल किया गया था। सीधे शब्दों में सब से गैर- "शब्द" वर्ण बोली:

$pattern =~ s/(\W)/\\$1/g; 

आप देख सकते हैं, आर कोड ऊपर यह एक ही प्रतिस्थापन का एक सीधा अनुवाद (बैकस्लैश नरक के माध्यम से एक यात्रा के बाद)। मैनपेज भी कहते हैं (जोर मेरा):

कुछ अन्य नियमित अभिव्यक्ति भाषाओं के विपरीत, वहाँ कोई backslashed प्रतीकों कि अक्षरांकीय नहीं हैं।

जो मेरे बिंदु को मजबूत करता है कि यह समाधान केवल पीसीआरई के लिए गारंटी है।

+0

आपको ध्यान रखना चाहिए कि आप स्ट्रिंग – Dason

+0

ओप्स का उपयोग कर रहे हैं, हाँ, मैं इसके बारे में भूल गया! –

6

जाहिर है वहाँ एक समारोह Hmisc पैकेज में escapeRegex कहा जाता है। समारोह में ही 'स्ट्रिंग' के एक इनपुट मान के लिए निम्न परिभाषा है:

gsub("([.|()\\^{}+$*?]|\\[|\\])", "\\\\\\1", string) 

मेरे पिछले जवाब:

मैं एक समारोह में बनाया गया है, लेकिन आप क्या करने के लिए एक बना सकता है तो यकीन नहीं है आपको क्या चाहिए। यह मूल रूप से केवल उन मानों का एक वेक्टर बनाता है जिन्हें आप प्रतिस्थापित करना चाहते हैं और जो वे आप उन्हें बदलना चाहते हैं उसका वेक्टर बनाता है और फिर आवश्यक प्रतिस्थापन करने वालों के माध्यम से लूप करता है।

re.escape <- function(strings){ 
    vals <- c("\\\\", "\\[", "\\]", "\\(", "\\)", 
       "\\{", "\\}", "\\^", "\\$","\\*", 
       "\\+", "\\?", "\\.", "\\|") 
    replace.vals <- paste0("\\\\", vals) 
    for(i in seq_along(vals)){ 
     strings <- gsub(vals[i], replace.vals[i], strings) 
    } 
    strings 
} 

कुछ उत्पादन

> test.strings <- c("What the $^&(){}.*|?", "foo[bar]") 
> re.escape(test.strings) 
[1] "What the \\$\\^&\\(\\)\\{\\}\\.\\*\\|\\?" 
[2] "foo\\[bar\\]" 
+0

यह एक अच्छा समाधान नहीं है।आपको 'वाल्स' में प्रत्येक विशेष रेगेक्सप चरित्र को शामिल करना होगा, जो मुश्किल हो सकता है। –

+0

@RyanTompson निश्चित - लेकिन यह एक शुरुआत है। और विशेष पात्रों की सूची सीमित है इसलिए यह एक बहुत बड़ा बोझ नहीं है। मैं यह नहीं कह रहा हूं कि यह एक इष्टतम समाधान है - बस यह एक संभावना है। यह भी ध्यान रखें कि आपकी विधि उन पात्रों से बच सकती है जिन्हें आम तौर पर रेगेक्स वर्ण नहीं माना जाता है ताकि उन्हें 'बुरा' भी माना जा सके। – Dason

+1

मेरी विधि कुछ पात्रों से बच सकती है जिन्हें बचने की आवश्यकता नहीं है, लेकिन ऐसा करने से कोई दिक्कत नहीं होगी, क्योंकि पीसीआरई के लिए * बैकस्लैश द्वारा उपसर्ग किए जाने पर भी * गैर * अल्फान्यूमेरिक चरित्र को शाब्दिक रूप में लिया जाता है, भले ही बैकस्लैश है जरूरत नहीं। –

संबंधित मुद्दे