উত্তর:
একক উদ্ধৃতিগুলির মধ্যে আপনি অংশটি চান তা ধরে নিয়ে, এইটি দিয়ে নিয়মিত প্রকাশটি ব্যবহার করুন 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
, এটিই ডিফল্ট আচরণ।
এর জন্য আপনার রেইগেক্সের দরকার নেই।
আপনার প্রকল্পে অ্যাপাচি কমন্স ল্যাং যুক্ত করুন ( 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));
}
}
}
এর জন্য একটি সহজ ওয়ান-লাইনার রয়েছে:
String target = myData.replaceAll("[^']*(?:'(.*?)')?.*", "$1");
মিলে যাওয়া গোষ্ঠীটি alচ্ছিক করে, এটি সেই ক্ষেত্রে একটি ফাঁকা ফিরিয়ে দিয়েও উদ্ধৃতি খুঁজে পাওয়া যায় না।
লাইভ ডেমো দেখুন ।
কারণ আপনি স্কেলাকেও টিক দিয়েছেন, রেগেক্স ছাড়াই একটি সমাধান যা সহজেই একাধিক উদ্ধৃত স্ট্রিংগুলির সাথে ডিল করে:
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
অ্যাপাচি কমন্স ল্যাং জাভা.এলিং এপিআই-র জন্য বেশ কয়েকটি সহায়ক সহায়ক সরবরাহ করে, বিশেষত স্ট্রিং ম্যানিপুলেশন পদ্ধতি। আপনার ক্ষেত্রে, শুরু এবং শেষ সাবস্ট্রিংগুলি একই, সুতরাং কেবল নিম্নলিখিত ফাংশনটি কল করুন।
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) আমার পক্ষে কাজ করেনি। আমি ইউআরএল সংস্করণটি খুঁজে পেতে গ্রুপ (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";