কীভাবে রেজেক্স ব্যবহার করে সাবস্ট্রিং নিষ্কাশন করা যায়


382

আমার একটি স্ট্রিং রয়েছে যার মধ্যে দুটি সিঙ্গল কোট রয়েছে, 'চরিত্রটি। একক উদ্ধৃতিগুলির মধ্যে থাকা ডেটাটি আমি চাই।

নীচের পাঠ্য থেকে "আমি যে ডেটা চাই" তা উত্তোলনের জন্য আমি কীভাবে একটি রেজেক্স লিখতে পারি?

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

উত্তর:


569

একক উদ্ধৃতিগুলির মধ্যে আপনি অংশটি চান তা ধরে নিয়ে, এইটি দিয়ে নিয়মিত প্রকাশটি ব্যবহার করুন 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));
}

ফলাফল:

আমি চাই ডেটা

12
জঘন্য .. আমি সর্বদা অ লোভী সংশোধক সম্পর্কে ভুলে যাই :(
মিহাই তোদার

33
আপনি যখন একাধিক ঘটনার প্রত্যাশা করবেন তখন "যদি" একটি "সাথে" প্রতিস্থাপন করুন
ওয়ানওয়ার্ড

14
মনে রাখবেন ম্যাচার.ফাইন্ড () এই কোড নমুনাটি কাজ করার জন্য প্রয়োজন। এই পদ্ধতিটি কল করতে ব্যর্থ হওয়ার ফলে ম্যাচচার.group (1) কল করার সময় "কোনও মিল খুঁজে পাওয়া যায়নি" ব্যতিক্রম ঘটবে।
রেক্সফোর্ড

25
@ এমফন্টৌরা গ্রুপ (0) পুরো ম্যাচটি বাইরের '' এর সাথে প্রত্যাবর্তন করবে। গোষ্ঠী (1) '' এর বাইরে '' তাদের ছাড়া '' এর মধ্যে যা রয়েছে তা ফিরিয়ে দেয়।
ট্যাগ 22

6
@ ল্যারি এই দেরী উত্তর, কিন্তু? এক্ষেত্রে অ-লোভী সংশোধক, যাতে this 'is' my 'data' with quotesএটি যত তাড়াতাড়ি সম্ভব থামাতে এবং ফিরে isযতটা সম্ভব অক্ষরের সাথে মিলিয়ে ফিরে আসবে is' my 'data, এটিই ডিফল্ট আচরণ।
টাইমকিলার

68

এর জন্য আপনার রেইগেক্সের দরকার নেই।

আপনার প্রকল্পে অ্যাপাচি কমন্স ল্যাং যুক্ত করুন ( http://commons.apache.org/proper/commons-lang/ ), তারপরে ব্যবহার করুন:

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

12
আপনার সফ্টওয়্যার কীভাবে বিতরণ করা হবে তা আপনাকে অ্যাকাউন্টে নিতে হবে। এটি যদি ওয়েবস্টার্টের মতো কিছু হয় তবে কেবল এটির একটি কার্যকারিতা ব্যবহার করার জন্য অ্যাপাচি কমন্স যুক্ত করা বুদ্ধিমানের কাজ নয়। তবে সম্ভবত তা হয় না। অ্যাপাচি কমনের পাশাপাশি আরও অনেক কিছু অফার রয়েছে। এমনকি শক্তটিও রেজেক্সকে জানা ভাল, কখন এটি ব্যবহার করা উচিত সে সম্পর্কে আপনাকে সতর্ক থাকতে হবে। Regex পড়া, লিখতে এবং ডিবাগ করা সত্যিই কঠিন হতে পারে। এটি ব্যবহার করে কিছু প্রসঙ্গ দেওয়া আরও ভাল সমাধান হতে পারে।
বীথর্ন

3
কখনও কখনও স্ট্রিংগটিলগুলি ইতিমধ্যে সেখানে থাকে, এই ক্ষেত্রে এই সমাধানটি অনেক বেশি পরিষ্কার এবং পাঠযোগ্য।
গ্যাবার নাগি

7
এটি 5 মাইল ভ্রমণ করার জন্য গাড়ি কেনার মতো (যখন আপনি কেবল বছরে একবার ভ্রমণ করছেন)।
প্রার্থনা করুন

সাবস্ট্রিং একটি নির্দিষ্ট স্ট্রিং বা মান সন্ধান করার সময়, রেজেক্স একটি ফর্ম্যাট সন্ধান করে। এটি আরও এবং বেশি গতিশীল। আপনার যদি রেগেক্স দরকার, যদি আপনি কোনও বিশেষ মানের পরিবর্তে কোনও প্যাটার্ন খুঁজছেন।
বুড়াখান আলকান

14
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)); <--- জিরো ভিত্তিক সূচক
এনক্লর্ড

4
নং গ্রুপ (0) এর বিশেষ অর্থ রয়েছে, ক্যাপচারিং গোষ্ঠী সূচক গ্রুপে শুরু হয় (1) (অর্থাত্ গ্রুপ (1) উত্তরে সঠিক)। "ক্যাপচার গ্রুপ বাম থেকে ডানে, এক থেকে শুরু থেকে সূচীবদ্ধ করা হয় গ্রুপ শূন্য সমগ্র প্যাটার্ন উল্লেখ করে।" - উত্স: docs.oracle.com/javase/8/docs/api/java/util/regex/...
Apriori

12

এর জন্য একটি সহজ ওয়ান-লাইনার রয়েছে:

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

মিলে যাওয়া গোষ্ঠীটি alচ্ছিক করে, এটি সেই ক্ষেত্রে একটি ফাঁকা ফিরিয়ে দিয়েও উদ্ধৃতি খুঁজে পাওয়া যায় না।

লাইভ ডেমো দেখুন ।


10

কারণ আপনি স্কেলাকেও টিক দিয়েছেন, রেগেক্স ছাড়াই একটি সমাধান যা সহজেই একাধিক উদ্ধৃত স্ট্রিংগুলির সাথে ডিল করে:

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)

4
পাঠযোগ্য সমাধান, এটি কেন লোকেরা
স্কেলকে

3
.split('\'').get(2)জাভাতে কেবল বা কিছু না কিছু কেন ? আমি মনে করি আপনার যদি একটি পঠনযোগ্য সমাধান মনে হয় তবে আপনার মস্তিষ্কের স্ক্যানের দরকার পড়তে পারে - দেখে মনে হচ্ছে কেউ আমার কাছে কিছু কোড গল্ফ করার চেষ্টা করছে।
আর্টঅফ ওয়ারফেয়ার


4

জাভাস্ক্রিপ্ট হিসাবে:

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

প্রকৃত regexp হয়: /'([^']+)'/

যদি আপনি অ লোভী সংশোধক ব্যবহার করেন (অন্য পোস্ট অনুসারে) এটি এর মতো:

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

এটা পরিষ্কার।


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


1

অ্যাপাচি কমন্স ল্যাং জাভা.এলিং এপিআই-র জন্য বেশ কয়েকটি সহায়ক সহায়ক সরবরাহ করে, বিশেষত স্ট্রিং ম্যানিপুলেশন পদ্ধতি। আপনার ক্ষেত্রে, শুরু এবং শেষ সাবস্ট্রিংগুলি একই, সুতরাং কেবল নিম্নলিখিত ফাংশনটি কল করুন।

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, "'", "'");

0

আপনি যদি ব্যবহার করেন তবে ল্যাপটি অ্যারেতে সমস্ত ম্যাচ সাবস্ট্রিং সঞ্চয় করতে লুপটি ব্যবহার করতে পারেন

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);

0

যোগ apache.commons আপনার এর উপর নির্ভরতা pom.xml

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-io</artifactId>
    <version>1.3.2</version>
</dependency>

এবং নীচে কোড কাজ করে।

StringUtils.substringBetween(String mydata, String "'", String "'")

0

কিছু কীভাবে গ্রুপ (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";
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.