regex

2010-06-18 13 views
6

का उपयोग करने से पहले सभी टेक्स्ट ढूंढें टेक्स्ट "टेक्स्ट से पहले सभी टेक्स्ट खोजने के लिए मैं regex का उपयोग कैसे कर सकता हूं इस पंक्ति से पहले सभी पाठ" शामिल होंगे?regex

मैं नीचे दिए गए उदाहरण के लिए

This can include deleting, updating, or adding records to your database, which would then be reflex. 

All text before this line will be included 

You can make this a bit more sophisticated by encrypting the random number and then verifying that it is still a number when it is decrypted. Alternatively, you can pass a value and a key instead. 

उत्तर

9
(.*?)All text before this line will be included 

क्या विशेष नियमित अभिव्यक्ति ढांचे का उपयोग कर रहे पर निर्भर करता है कुछ नमूना पाठ भी शामिल है, आप संकेत मिलता है कि . न्यू लाइन वर्णों से मेल कर सकते हैं एक ध्वज शामिल करने के लिए आवश्यकता हो सकती है भी।

पहले (और केवल) उपसमूह में मिलान किए गए टेक्स्ट शामिल होंगे। आप कैसे निकालेंगे फिर से आप किस भाषा और नियमित अभिव्यक्ति ढांचे का उपयोग कर रहे हैं इस पर निर्भर करेंगे।

यदि आप "इस पंक्ति से पहले सभी पाठ ..." टेक्स्ट शामिल हैं, तो पूरा मिलान वह है जो आप चाहते हैं।

+1

इस मैच में * टेक्स्ट शामिल होगा "इस पंक्ति से पहले सभी पाठ शामिल किए जाएंगे" - यह स्पष्ट नहीं है कि यह मूल प्रश्न से वांछित है, लेकिन अगर नहीं, तो इसे बाहर करने के तरीके पर मेरा उत्तर देखें। –

+1

मेरा मतलब यह था कि पहले उपसमूह में मिलान करने वाला टेक्स्ट शामिल होगा। मैं स्पष्ट करने के लिए संपादित करेंगे। – VoteyDisciple

+1

हाँ, लेकिन मैं तर्क दूंगा कि लुकहेड अवधारणात्मक रूप से जो चाहता है उसके करीब है (और इस प्रकार बेहतर विकल्प)। बेशक, लुकहेड हमेशा उपलब्ध नहीं होता है, लेकिन यदि आपके पास यह नहीं है तो शायद आपके पास आलसी मिलान नहीं है ... मैंने यह सारी जानकारी मेरे उत्तर में जोड़ने का प्रयास किया है, उम्मीद है कि यह स्पष्ट रूप से किया गया है। –

1

यह करना चाहिए:

<?php 
$str = "This can include deleting, updating, or adding records to your database, which would then be reflex. 

All text before this line will be included 

You can make this a bit more sophisticated by encrypting the random number and then verifying that it is still a number when it is decrypted. Alternatively, you can pass a value and a key instead."; 

echo preg_filter("/(.*?)All text before this line will be included.*/s","\\1",$str); 
?> 

रिटर्न:

This can include deleting, updating, or adding records to your database, which would then be reflex. 
11

एक विवरण के साथ शुरू ... त्वरित उत्तर

के लिए समाप्त करने के लिए एक विशिष्ट भाग तक मिलान करने के लिए छोड़ पाठ का, और पुष्टि करें कि यह वहां है लेकिन इसे मैच के साथ शामिल नहीं किया गया है, आप नोटेशन (?=regex) का उपयोग करके सकारात्मक दिखने का उपयोग कर सकते हैं

यह पुष्टि करता है कि उस स्थिति में 'रेगेक्स' मौजूद है, लेकिन इसकी प्रारंभिक स्थिति से केवल प्रारंभ स्थिति से मेल खाता है।

तो, यह हमें अभिव्यक्ति देता है:

.*?(?=All text before this line will be included) 

कहाँ . किसी भी चरित्र है, और *? एक आलसी मुकाबला नहीं है (कम से कम रकम, नियमित रूप से * की तुलना में जो सबसे अधिक राशि संभव खपत की खपत)।

हालांकि, लगभग सभी रेगेक्स स्वादों में . नई लाइन को बाहर कर देगा, इसलिए हमें न्यूलाइन को शामिल करने के लिए स्पष्ट रूप से ध्वज का उपयोग करने की आवश्यकता है। उपयोग करने के लिए ध्वज s है, (जो "सिंगल-लाइन मोड" के लिए खड़ा है, हालांकि इसे कुछ स्वादों में "डॉटल" मोड भी कहा जाता है)।

और यह सहित विभिन्न तरीकों से लागू किया जा सकता ...

विश्व स्तर पर,/आधारित regexes के लिए:

/regex/s 

इनलाइन, regex के लिए वैश्विक:

(?s)regex 

इनलाइन, केवल ब्रैकेट किए गए भाग पर लागू होता है:

(?s:reg)ex 

और फ़ंक्शन तर्क के रूप में (इस भाषा पर निर्भर करता है कि आप किस भाषा के साथ रेगेक्स कर रहे हैं)।

(?s).*?(?=All text before this line will be included) 


हालांकि, कुछ चेतावनियां हैं::

तो, शायद regex आप चाहते हैं यह है

सबसे पहले, नहीं सब regex जायके आलसी परिमाणकों का समर्थन - आपको केवल .* का उपयोग करना पड़ सकता है, (या संभावित रूप से सटीक आवश्यकताओं के आधार पर अधिक जटिल तर्क का उपयोग करें यदि "सभी पाठ पहले ... "कई बार प्रकट हो सकता है)।

दूसरा, सभी रेगेक्स स्वाद नहीं दिखने वाले समर्थन का समर्थन करते हैं, इसलिए आपको उस पाठ को प्राप्त करने के लिए कैप्चर किए गए समूहों का उपयोग करने की आवश्यकता होगी, जिसे आप मिलान करना चाहते हैं।

अंत में, आप हमेशा इस तरह के ऊपर s के रूप में झंडे, निर्दिष्ट नहीं कर सकते, तो बराबर मिलान पाने के लिए या तो मैच "कुछ भी या नई पंक्ति" (.|\n) या हो सकता है [\s\S] (सफेद स्थान को और नहीं खाली स्थान के) करना पड़ सकता है।

आप (मुझे लगता है कि एक्सएमएल कार्यान्वयन है) इन सब के आधार पर सीमित कर रहे हैं, तो आप करना होगा:

([\s\S]*)All text before this line will be included 

और फिर मैच के परिणाम से पहले उप समूह निकालें।

+0

आह, धन्यवाद, यह जानना उपयोगी है! – vimist

+0

बहुत खराब ओपी ने कभी जवाब स्वीकार नहीं किया। सब मेरे लिए बहुत उपयोगी रहे हैं। – helgatheviking

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