regex

2011-01-11 27 views
268

का उपयोग करके एक सबस्ट्रिंग निकालने के लिए कैसे करें मेरे पास एक स्ट्रिंग है जिसमें ' वर्ण है। एकल कोट्स के बीच में जो डेटा मैं चाहता हूं वह है।regex

मैं निम्नलिखित पाठ से "इच्छित डेटा" निकालने के लिए रेगेक्स कैसे लिख सकता हूं?

mydata = "some string with 'the data i want' inside"; 

उत्तर

405

मान लिया जाये कि आप एकल उद्धरण के बीच हिस्सा चाहते हैं, एक Matcher के साथ इस रेगुलर एक्सप्रेशन का उपयोग तुम भी टिक स्काला, regex के बिना एक समाधान है जो आसानी से कई उद्धृत तार के साथ सौदों:

val text = "some string with 'the data i want' inside 'and even more data'" 
text.split("'").zipWithIndex.filter(_._2 % 2 != 0).map(_._1) 

res: Array[java.lang.String] = Array(the data i want, and even more data) 
+9

लानत .. मैं हमेशा गैर लालची संशोधक :( –

+20

की जगह के बारे में भूल "अगर" के साथ एक "जबकि" जब आप उम्मीद कर एक से अधिक आवृत्तियां – OneWorld

+10

मन इस कोड नमूने के लिए काम करने के लिए matcher.find() की आवश्यकता है। इस विधि को कॉल करने में असफल होने पर matcher.group (1) को कॉल करने पर "कोई मिलान नहीं मिला" अपवाद होगा। – rexford

3
जावास्क्रिप्ट में के रूप में

:

mydata.match(/'([^']+)'/)[1] 

वास्तविक regexp है: /'([^']+)'/

आप गैर लालची संशोधक का उपयोग (एक और पोस्ट के अनुसार) है, तो यह इस तरह है:

mydata.match(/'(.*?)'/)[1] 

यह क्लीनर है।

"'(.*?)'" 

उदाहरण::

String mydata = "some string with 'the data i want' inside"; 
Pattern pattern = Pattern.compile("'(.*?)'"); 
Matcher matcher = pattern.matcher(mydata); 
if (matcher.find()) 
{ 
    System.out.println(matcher.group(1)); 
} 

परिणाम:

 
the data i want 
9
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class Test { 
    public static void main(String[] args) { 
     Pattern pattern = Pattern.compile(".*'([^']*)'.*"); 
     String mydata = "some string with 'the data i want' inside"; 

     Matcher matcher = pattern.matcher(mydata); 
     if(matcher.matches()) { 
      System.out.println(matcher.group(1)); 
     } 

    } 
} 
+2

System.out.println (matcher.group (0)); <--- शून्य आधारित सूचकांक – nclord

+1

सं। समूह (0) का विशेष अर्थ है, इंडेक्स समूह (1) (यानी समूह (1) उत्तर में सही है) कैप्चरिंग समूह शुरू होते हैं। "कैप्चरिंग समूह को बाएं से दाएं से अनुक्रमित किया जाता है, एक से शुरू होता है। समूह शून्य पूरे पैटर्न को दर्शाता है" - स्रोत: https://docs.oracle.com/javase/8/docs/api/java/util/regex/ Matcher.html # group-int- – Apriori

+0

मैंने समूह (1) का उपयोग किया लेकिन मुझे कोई परिणाम नहीं मिला ... –

8

क्योंकि

+0

चालाक। पसन्द आया। –

+3

तो पठनीय समाधान, यही कारण है कि लोग स्काला मुझे विश्वास करते हैं :) – prayagupd

+2

क्यों नहीं '.plit (' \ '')। जावा में उस सीमा तक (2) 'या कुछ प्राप्त करें? मुझे लगता है कि आपको एक मस्तिष्क स्कैन प्राप्त करने की आवश्यकता हो सकती है यदि आपको लगता है कि यह एक पठनीय समाधान है - ऐसा लगता है कि कोई मेरे लिए कुछ कोड गोल्फ करने की कोशिश कर रहा था। – ArtOfWarfare

2

स्काला में,

val ticks = "'([^']*)'".r 

ticks findFirstIn mydata match { 
    case Some(ticks(inside)) => println(inside) 
    case _ => println("nothing") 
} 

for (ticks(inside) <- ticks findAllIn mydata) println(inside) // multiple matches 

val Some(ticks(inside)) = ticks findFirstIn mydata // may throw exception 

val ticks = ".*'([^']*)'.*".r  
val ticks(inside) = mydata // safe, shorter, only gets the first set of ticks 
53

आप इस के लिए regex जरूरत नहीं है।

अपनी परियोजना (http://commons.apache.org/proper/commons-lang/) को Apache Commons लैंग जोड़ कर का उपयोग करें:

String dataYouWant = StringUtils.substringBetween(mydata, "'"); 
+0

धन्यवाद ..... मैं regex करने के लिए नौसिखिया हूँ ... तो मुझे लगता है कि यह आसान तरीका है .... –

+63

नहीं, आपको regex का उपयोग करना चाहिए। यह सरल कार्यक्षमता के लिए आपकी परियोजना में पूरी तरह से बड़ी निर्भरता जोड़ने के लिए एक भयानक bloat है। रेगेक्स सीखें, आप इसे अपने करियर में और अधिक इस्तेमाल करेंगे। – BadZen

+9

आपको यह ध्यान रखना होगा कि आपका सॉफ्टवेयर कैसे वितरित किया जाएगा। यदि यह वेबस्टार्ट की तरह कुछ है तो यह केवल एक कार्यक्षमता का उपयोग करने के लिए अपाचे कॉमन्स को जोड़ना बुद्धिमान नहीं है। लेकिन शायद यह नहीं है। अपाचे कॉमन्स के अलावा पेशकश करने के लिए बहुत कुछ है। रेगेक्स को जानना भी मुश्किल है, आपको इसे कब इस्तेमाल करना है, इस पर सावधान रहना होगा। रेगेक्स पढ़ने, लिखने और डीबग करने में वाकई मुश्किल हो सकता है। इसका उपयोग करके कुछ संदर्भ दिए गए बेहतर समाधान हो सकते हैं। – Beothorn

3

इस के लिए एक सरल एक लाइनर नहीं है:

String target = myData.replaceAll("[^']*(?:'(.*?)')?.*", "$1"); 

मिलान समूह वैकल्पिक बनाने से, यह भी उस मामले में रिक्त स्थान लौटकर उद्धरणों को पूरा नहीं किया जा रहा है।

live demo देखें।

1
String dataIWant = mydata.replaceFirst(".*'(.*?)'.*", "$1"); 
+1

कृपया अपना कोड समझाएं। – bfontaine