Regex दो तारों के बीच सभी वर्णों का मिलान करता है


434

उदाहरण: "यह सिर्फ साधारण वाक्य है।"

मैं "यह है" और "वाक्य" के बीच हर चरित्र का मिलान करना चाहता हूं। लाइन ब्रेक की अनदेखी की जानी चाहिए। मैं सही सिंटैक्स का पता नहीं लगा सकता।


11
आप संकेत करना चाह सकते हैं कि आप Regex का उपयोग किस वातावरण में कर रहे हैं। "उपेक्षा" लाइन टूटने के अर्थ के आधार पर मतभेद हो सकते हैं।
एंड्रयू बार्बर

जवाबों:


646

उदाहरण के लिए

(?<=This is)(.*)(?=sentence)

Regexr

मैंने खोजबीन का उपयोग किया (?<=)और आगे देखा (?=)ताकि "यह" और "वाक्य" मैच में शामिल न हो, लेकिन यह आपके उपयोग के मामले पर निर्भर है, आप बस लिख भी सकते हैं This is(.*)sentence

यहां महत्वपूर्ण बात यह है कि आप अपने रेगेक्स इंजन के "डॉटॉल" मोड को सक्रिय करते हैं, जिससे कि .नई लाइन मेल कर रही है। लेकिन आप यह कैसे करते हैं यह आपके रेगेक्स इंजन पर निर्भर करता है।

अगली बात यह है कि यदि आप उपयोग करते हैं .*या .*?। पहला व्यक्ति लालची है और आपकी स्ट्रिंग में अंतिम "वाक्य" तक मेल करेगा, दूसरा एक आलसी है और आपकी स्ट्रिंग में अगले "वाक्य" तक मेल खाएगा।

अपडेट करें

Regexr

This is(?s)(.*)sentence

जहां (? S) डॉटलाइन संशोधक को चालू करता है, जिससे .मिलान को नईलाइन वर्ण बनाता है ।

अपडेट 2:

(?<=is \()(.*?)(?=\s*\))

आपके उदाहरण का मिलान कर रहा है "यह एक सरल वाक्य है"। Regexr पर यहाँ देखें


@ टिचर, माफ करना मुझे यह देखना था। क्या मैं इसे सही समझता हूं और This is(?s)(.*)sentenceकाम कर रहा हूं ?
Stema

@stema: हाँ, यह सबसे regex पुस्तकालयों के तहत "डॉट ऑल" मोड को सक्षम करने के लिए काम करना चाहिए।
tchrist

1
कि ज्यादातर मेरी समस्या हल हो गई, लेकिन मैं अपने पैटर्न में एक सफेद अंतरिक्ष चरित्र कैसे शामिल करूं? मैंने निम्नलिखित की कोशिश की: "(। *।?) ())" एक अनुक्रम के अंत में ") से मिलान करने के लिए, लेकिन यह काम नहीं किया।
0xbadf00d

28
सिर्फ एक नोट - regexr का कहना है कि अब जावास्क्रिप्ट में समर्थित नहीं दिख रहा है
कोवो

2
क्या पाठ के ब्लॉक में इस विभाजन के बार-बार होने वाले परिवर्तनों से निपटने का कोई तरीका है? FOr उदाहरण: "यह सिर्फ \ Na सरल वाक्य है। यहाँ कुछ अतिरिक्त सामान है। यह सिर्फ \ Na सरल वाक्य है। और यहाँ कुछ और सामान है। यह सिर्फ \ n सरल वाक्य है।" वर्तमान में यह प्रत्येक उदाहरण के बजाय पूरे स्ट्रिंग से मेल खाता है।
jzadra

181

आलसी क्वांटिफायर की जरूरत

इस प्रश्न को पुनर्जीवित करना क्योंकि स्वीकृत उत्तर में रेगेक्स मेरे लिए बिल्कुल सही नहीं लगता है। क्यों? चूंकि

(?<=This is)(.*)(?=sentence)

से मेल खाएगी my first sentence. This is my secondमेंThis is my first sentence. This is my second sentence.

डेमो देखें

आपको दो लुकरॉइड के बीच एक आलसी क्वांटिफायर की आवश्यकता है। जोड़ने ?से तारा आलसी हो जाता है।

यह आप क्या चाहते हैं से मेल खाता है:

(?<=This is).*?(?=sentence)

डेमो देखें । मैंने कैप्चर ग्रुप को हटा दिया, जिसकी जरूरत नहीं थी।

रेखा के पार की रेखाओं का मिलान करने के लिए डॉटाल मोड

ध्यान दें कि डेमो में "डॉट मैच लाइन ब्रेक मोड" (उर्फ) डॉट-ऑल सेट है (देखें कि विभिन्न भाषाओं में डॉटाल कैसे चालू करें )। कई रेगेक्स फ्लेवर्स में, आप इसे ऑनलाइन मोडिफ़ायर के साथ सेट कर सकते हैं (?s):

(?s)(?<=This is).*?(?=sentence)

संदर्भ


आप कैप्चरिंग ग्रुप के बारे में सही हैं। पता नहीं मैंने ऐसा क्यों किया है। लेकिन मेरे उत्तर में .*और .*?"अपडेट" से पहले पैराग्राफ) के बीच का अंतर भी समझाया गया है। इसलिए मुझे नहीं लगता कि मेरा जवाब गलत है।
स्टेमा

2
@stema नाइटपैकिंग के बारे में क्षमा करें, कल आपके कुछ जवाबों के माध्यम से मंडराते हुए केवल यही एक चीज है जिसने मुझे चिकोटी दी। :) मैंने इससे पहली पंक्ति को नरम कर is incorrectदिया doesn't seem quite correct to me... आशा है कि यह आपको चिकोटी नहीं देता है, शायद इस तरह के उच्च-यातायात उत्तर के लिए regex क्या होना चाहिए, इसके बारे में बस एक धारणा है।
zx81

39

कोशिश करो This is[\s\S]*sentence, जावास्क्रिप्ट में काम करता है


इस तरह से एक आलसी लुकअप कैसे करें?
अगेम्प्लेयर

4
@AwQiruiGuo ऊपर के रूप में ही। [\s\S]*?(यह भी कहा जाता है: गैर लालची वाइल्डकार्ड)
phil294


13

इसे इस्तेमाल करो: (?<=beginningstringname)(.*\n?)(?=endstringname)


पता नहीं क्यों सभी वोट, यह 0-1 लाइन टूटने की अनुमति देता है, और लाइन ब्रेक तुरंत पहले होना चाहिएendstringname
OGHaza

मुझे लॉग लाइनों (टाइमस्टैम्प आदि) की शुरुआत को हटाने के लिए यह उपयोगी लगा। मैंने शुरुआत स्ट्रिंग के लिए और अंत स्ट्रिंग के लिए "at" के लिए नई लाइन का उपयोग किया।
स्टेन

2

मामले में कोई भी जेनकींस के संदर्भ में इसका एक उदाहरण ढूंढ रहा है। यह build.log को पार्स करता है और यदि यह एक मैच पाता है तो यह मैच के साथ बिल्ड को विफल करता है।

import java.util.regex.Matcher;
import java.util.regex.Pattern;

node{    
    stage("parse"){
        def file = readFile 'build.log'

        def regex = ~"(?s)(firstStringToUse(.*)secondStringToUse)"
        Matcher match = regex.matcher(file)
        match.find() {
            capturedText = match.group(1)
            error(capturedText)
        }
    }
}


0

उदात्त पाठ 3x

उदात्त पाठ में, आप बस दो शब्दों को लिखते हैं जिन्हें आप अपने मामले में उदाहरण के लिए रखने में रुचि रखते हैं

"यह" और "वाक्य" है

और आप लिखते हैं

अर्थात This is .* sentence

और यह आपको अच्छा करना चाहिए


यह सुनिश्चित नहीं है कि यह प्रश्न सब्लिम टेक्स्ट में कैसे किया जाता है, लेकिन ज्यादातर सबलेम टेक्स्ट में काम करता है। जब यह "यह है" और "वाक्य" के बीच एक लाइनब्रेक होता है तो यह काम नहीं करता है। इसके अलावा, उदात्त पाठ भी उन दो तारों के बीच के पाठ के बजाय "यह है" और "वाक्य" का चयन करता है ।
डायलन किंनेट

0

यहाँ बताया गया है कि मैंने यह कैसे किया:
यह मेरे लिए आसान था कि मैं विशिष्ट रेगेक्स को जानने की कोशिश करूं ।

int indexPictureData = result.IndexOf("-PictureData:");
int indexIdentity = result.IndexOf("-Identity:");
string returnValue = result.Remove(indexPictureData + 13);
returnValue = returnValue + " [bytecoderemoved] " + result.Remove(0, indexIdentity); ` 

0

वीआईएम में त्वरित खोज के लिए, आप विम कंट्रोल प्रॉम्प्ट पर उपयोग कर सकते हैं: / यह है। * \ _। * वाक्य


0

मैं प्रिंट "स्ट्रिंग" के बीच इस प्रिंट सिंटैक्स को परिवर्तित करने के लिए रेगेक्स के लिए अपनी खोज पर यहां आया, Python2 में पुरानी स्क्रिप्ट में: प्रिंट ("स्ट्रिंग"), Python3 के लिए। अच्छी तरह से काम करता है, अन्यथा अतिरिक्त रूपांतरण के लिए 2to3.py का उपयोग करें। यहाँ दूसरों के लिए मेरा समाधान है:

इसे Regexr.com पर आज़माएं (किसी कारण से NP ++ में काम नहीं करता है):

find:     (?<=print)( ')(.*)(')
replace: ('$2')

चरों के लिए:

(?<=print)( )(.*)(\n)
('$2')\n

लेबल और चर के लिए:

(?<=print)( ')(.*)(',)(.*)(\n)
('$2',$4)\n

Python3 के लिए प्रिंट ("स्ट्रिंग") के साथ Python2 में सभी प्रिंट "स्ट्रिंग" को कैसे बदलें?


0

यह मेरे लिए काम कर रहा है (मैं VS कोड का उपयोग कर रहा हूं ):

के लिये: This is just\na simple sentence

उपयोग: This .+ sentence


0

जावा दृष्टिकोण का उपयोग करके दो तारों के बीच सब कुछ मैच करने के लिए RegEx।

List<String> results = new ArrayList<>(); //For storing results
String example = "Code will save the world";

RegEx ( ?) * का उपयोग करने के लिए पैटर्न और मिलान वस्तुओं का उपयोग करते हैं ।

Pattern p = Pattern.compile("Code "(.*?)" world");   //java.util.regex.Pattern;
Matcher m = p.matcher(example);                      //java.util.regex.Matcher;

चूंकि मिलानकर्ता में एक से अधिक मैच हो सकते हैं, हमें परिणामों पर लूप करने और इसे स्टोर करने की आवश्यकता है।

while(m.find()){   //Loop through all matches
   results.add(m.group()); //Get value and store in collection.
}

इस उदाहरण में केवल " शब्द शामिल होगा" शब्द को बचाएगा , लेकिन बड़े पाठ में संभवतः अधिक मैच मिलेंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.