रेगेक्स मैच के बाद आने वाले पाठ को प्राप्त करना


84

मैं रेगेक्स का उपयोग करने के लिए नया हूं, मैं ट्यूटोरियल की एक रेक के माध्यम से जा रहा हूं, लेकिन मुझे वह नहीं मिला जो मैं करना चाहता हूं, जो लागू होता है:

मैं किसी चीज़ की खोज करना चाहता हूं, लेकिन इसके बाद सब कुछ वापस कर देता हूं लेकिन खोज स्ट्रिंग ही नहीं

उदाहरण के लिए " कुछ लम्पट वाक्य जो कमाल के हैं "

" वाक्य " की खोज

वापसी " वह भयानक है "

कोई भी सहायताकाफी प्रशंसनीय होगी

यह मेरा अब तक का रेक्स है

sentence(.*) 

लेकिन यह लौटता है: वह वाक्य जो भयानक है

Pattern pattern = Pattern.compile("sentence(.*)");

Matcher matcher = pattern.matcher("some lame sentence that is awesome");

boolean found = false;
while (matcher.find())
{
    System.out.println("I found the text: " + matcher.group().toString());
    found = true;
}
if (!found)
{
    System.out.println("I didn't find the text");
}

आपका वास्तविक कॉल क्या है? क्या आप उपयोग कर रहे हैं Matcher?
ग्रेजेगोरज ओल्दज़की

मैं
स्कॉट

... और हम अभी भी अपना वास्तविक जावा कोड देखना चाहते हैं ताकि यह पता लगाया जा सके कि क्या गलत है।
स्टीव जोर्गेनसन

System.out.println("I found the text: " + "some lame sentance that is aweomse".substring(end()));
निशांत

3
@DavidIsNotHere नाज़ी की राजधानी N होनी चाहिए ...
ली टेलर

जवाबों:


135

आप इसे "बस नियमित अभिव्यक्ति" के साथ कर सकते हैं जैसा आपने एक टिप्पणी में पूछा था:

(?<=sentence).*

(?<=sentence)एक सकारात्मक खोज है । यह स्ट्रिंग में एक निश्चित स्थिति पर मेल खाता है, अर्थात् पाठ के ठीक बाद की स्थिति में sentenceउस पाठ को मैच का हिस्सा बनाए बिना। नतीजतन, के (?<=sentence).*बाद किसी भी पाठ से मेल खाएगा sentence

यह रेगेक्स की काफी अच्छी विशेषता है। हालाँकि, जावा में यह केवल परिमित-लम्बाई के उप-वर्गों के लिए काम करेगा, अर्थात (?<=sentence|word|(foo){1,4})कानूनी है, लेकिन (?<=sentence\s*)ऐसा नहीं है।


आप कहते हैं कि इसमें सकारात्मक खोज के दावे को शामिल नहीं किया जाना चाहिए। तो मैं मान लेता हूँ कि "*। लेकिन ऐसा नहीं है, यह "वाक्य" भी लौटाता है। मैं क्या खो रहा हूँ?
JJJones_3860

@ user2184214: ऐसा इसलिए है क्योंकि यह जोर के पीछे एक नज़र है । .*किसी भी पाठ से मेल खाता है, और फिर (?<=...)शब्द के लिए पीछे की ओर देखता है sentence, इस मामले में यह कहते हुए कि मैच उस शब्द के साथ समाप्त होता है। यदि आप उस शब्द से पहले रुकना चाहते हैं, तो आपको आगे देखना .*(?=sentence)होगा : उसके बाद आने वाले किसी भी पाठ से मेल खाएगा sentence
टिम पिएट्ज़कर

17

आपका रेगेक्स "sentence(.*)"सही है। कोष्ठक में समूह की सामग्री को पुनः प्राप्त करने के लिए, आप कॉल करेंगे:

Pattern p = Pattern.compile( "sentence(.*)" );
Matcher m = p.matcher( "some lame sentence that is awesome" );
if ( m.find() ) {
   String s = m.group(1); // " that is awesome"
}

m.find()इस मामले में उपयोग पर ध्यान दें (स्ट्रिंग पर कहीं भी खोजने का प्रयास) और नहीं m.matches()(उपसर्ग "लंगड़ा" के कारण विफल होगा; इस मामले में रेगेक्स की आवश्यकता होगी ".*sentence(.*)")


धन्यवाद, लेकिन क्या होगा अगर मैं चाहता हूं कि यह "वह भयानक है" लौटे
स्कॉट

धन्यवाद आदमी, यह बहुत अच्छा काम किया, मैं उम्मीद कर रहा था कि नियमित अभिव्यक्ति के साथ ऐसा करने का एक तरीका था, अगर मैं इसे इस तरह से करने का एक तरीका नहीं ढूंढ सकता, तो यह काम करेगा
स्कॉट

प्रदर्शन के लिए regexp के अंत में "(। *)" जोड़ने के लिए एक बुरा विचार ...
ेरेगन

8

यदि strमैच के बाद मैचर की शुरुआत की जाती है, तो आप मैच के बाद का हिस्सा प्राप्त कर सकते हैं

str.substring(matcher.end())

नमूना कोड:

final String str = "Some lame sentence that is awesome";
final Matcher matcher = Pattern.compile("sentence").matcher(str);
if(matcher.find()){
    System.out.println(str.substring(matcher.end()).trim());
}

आउटपुट:

यह बहुत अच्छा है


matcher.find()इससे पहले आवश्यक है, IMO।
निशांत

@ निशांत ने यही लिखा है: "मैच के बाद"। उदाहरण के लिए नमूना कोड जोड़ा गया
शॉन पैट्रिक फ्लोयड

1

आपको अपने मिलानकर्ता के समूह (int) का उपयोग करने की आवश्यकता है - समूह (0) संपूर्ण मैच है, और समूह (1) आपके द्वारा चिह्नित पहला समूह है। आपके द्वारा निर्दिष्ट उदाहरण में, समूह (1) " वाक्य " के बाद आता है ।


1

आपको बस निम्नलिखित पंक्ति में "समूह ()" के बजाय "समूह (1)" डालना होगा और वापसी वही होगी जो आप चाहते हैं:

System.out.println("I found the text: " + matcher.group(**1**).toString());
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.