जवाबों:
यह मानते हुए कि आप एकल उद्धरणों के बीच का भाग चाहते हैं, इस नियमित अभिव्यक्ति का उपयोग करें Matcher
:
"'(.*?)'"
उदाहरण:
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));
}
परिणाम:
डेटा मुझे चाहिए
this 'is' my 'data' with quotes
यह जल्दी बंद is
हो जाए और अधिक से अधिक पात्रों के मिलान के बजाय वापस आ जाए और वापस लौट आए is' my 'data
, जो कि डिफ़ॉल्ट व्यवहार है।
इसके लिए आपको regex की आवश्यकता नहीं है।
Apache commons lang को अपनी परियोजना में शामिल करें ( http://commons.apache.org/proper/commons-lang/ ), तो निम्न कार्य करें:
String dataYouWant = StringUtils.substringBetween(mydata, "'");
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));
}
}
}
क्योंकि आपने स्केला को भी टिक किया है, रेगेक्स के बिना एक समाधान जो कई उद्धृत स्ट्रिंग्स के साथ आसानी से निपटता है:
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)
.split('\'').get(2)
जावा में बस कुछ हद तक? मुझे लगता है कि अगर आपको लगता है कि एक पठनीय समाधान है तो आपको ब्रेन स्कैन करवाना पड़ सकता है - ऐसा लगता है कि कोई मेरे लिए कुछ कोड गोल्फ करने की कोशिश कर रहा है।
जावास्क्रिप्ट में के रूप में:
mydata.match(/'([^']+)'/)[1]
वास्तविक regexp है: /'([^']+)'/
यदि आप गैर लालची संशोधक का उपयोग करते हैं (एक अन्य पोस्ट के अनुसार) यह इस तरह है:
mydata.match(/'(.*?)'/)[1]
यह क्लीनर है।
स्काला में,
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
Apache Commons Lang java.lang API के लिए सहायक उपयोगिताओं का एक मेजबान प्रदान करता है, विशेष रूप से स्ट्रिंग हेरफेर के तरीके। आपके मामले में, प्रारंभ और अंत सबस्ट्रिंग समान हैं, इसलिए बस निम्नलिखित फ़ंक्शन को कॉल करें।
StringUtils.substringBetween(String str, String tag)
स्ट्रिंग जो एक ही स्ट्रिंग के दो उदाहरणों के बीच में निहित है ।
यदि प्रारंभ और अंत सबस्ट्रिंग अलग-अलग हैं, तो निम्न अधिभार विधि का उपयोग करें।
StringUtils.substringBetween(String str, String open, String close)
स्ट्रिंग है कि दो स्ट्रिंग्स के बीच में निहित है हो जाता है।
यदि आप मेल खाने वाले सबस्ट्रिंग के उदाहरण चाहते हैं, तो उपयोग करें,
StringUtils.substringsBetween(String str, String open, String close)
एक शुरुआत और अंत टैग द्वारा सीमांकित सबस्ट्रिंग के लिए एक स्ट्रिंग खोजता है, जो सभी मिलान सब्सट्रिंग को एक सरणी में लौटाता है ।
प्रश्न में उदाहरण के लिए मेल खाने वाले विकल्प के सभी उदाहरण प्राप्त करने के लिए
String[] results = StringUtils.substringsBetween(mydata, "'", "'");
यदि आप उपयोग करते हैं, तो आप इसे उपयोग कर सकते हैं जबकि लूप सरणी में प्रतिस्थापित सभी मैचों को संग्रहीत करने के लिए उपयोग कर सकते हैं
if (matcher.find())
{
System.out.println(matcher.group(1));
}
आप सबस्टेशन से मेल खाते हैं, इसलिए आप इसका उपयोग सभी मैचों को प्रतिस्थापित करने के लिए कर सकते हैं
Matcher m = Pattern.compile("[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+").matcher(text);
// Matcher mat = pattern.matcher(text);
ArrayList<String>matchesEmail = new ArrayList<>();
while (m.find()){
String s = m.group();
if(!matchesEmail.contains(s))
matchesEmail.add(s);
}
Log.d(TAG, "emails: "+matchesEmail);
कुछ (1) समूह ने मेरे लिए कैसे काम किया। मैंने url संस्करण को खोजने के लिए समूह (0) का उपयोग किया।
Pattern urlVersionPattern = Pattern.compile("\\/v[0-9][a-z]{0,1}\\/");
Matcher m = urlVersionPattern.matcher(url);
if (m.find()) {
return StringUtils.substringBetween(m.group(0), "/", "/");
}
return "v0";