নিয়মিত এক্সপ্রেশন ব্যবহার করে আরও বড় স্ট্রিংয়ের সাবস্ট্রিং সন্ধান করতে জাভা ব্যবহার করে


140

আমার যদি এর মতো স্ট্রিং থাকে:

FOO[BAR]

"বার" স্ট্রিংটি স্ট্রিংয়ের বাইরে নেওয়ার জন্য আমার একটি জেনেরিক উপায় প্রয়োজন যাতে বর্গাকার বন্ধনীগুলির মধ্যে স্ট্রিংটি যাই হোক না কেন এটি স্ট্রিংটি পেতে সক্ষম হবে।

যেমন

FOO[DOG] = DOG
FOO[CAT] = CAT

উত্তর:


253

আপনার অ-লোভী কোয়ান্টিফায়ার ব্যবহার করতে সক্ষম হওয়া উচিত, বিশেষত * ?. আপনি সম্ভবত নিম্নলিখিতগুলি চাইবেন:

Pattern MY_PATTERN = Pattern.compile("\\[(.*?)\\]");

এটি আপনাকে এমন একটি প্যাটার্ন দেবে যা আপনার স্ট্রিংয়ের সাথে মিলবে এবং পাঠ্যটিকে প্রথম গ্রুপে বর্গাকার বন্ধনীগুলির মধ্যে রাখবে। কটাক্ষপাত আছে প্যাটার্ন API ডকুমেন্টেশন দেখুন।

স্ট্রিংটি নিষ্কাশনের জন্য, আপনি নিম্নলিখিতগুলির মতো কিছু ব্যবহার করতে পারেন:

Matcher m = MY_PATTERN.matcher("FOO[BAR]");
while (m.find()) {
    String s = m.group(1);
    // s now contains "BAR"
}

16
এটি উল্লেখ করার মতো যে যদি বর্গাকার বন্ধনীগুলির মধ্যে একটি নতুন লাইন থাকে তবে এটি ব্যর্থ হবে এবং এটি এড়াতে আপনার প্যাটার্ন.ডটল পতাকা ব্যবহার করা উচিত।
ক্লিটাস

উপরের প্যাটার্নটি ব্যবহার করে আপনি কীভাবে বার বার স্ট্রিং যুক্ত স্ট্রিংটি বের করতে এটি ব্যবহার করবেন? আমি প্যাটার্ন এপিআই এবং ম্যাচার এপিআইয়ের দিকে তাকিয়ে আছি তবে কীভাবে স্ট্রিংটি পাবেন তা আমি এখনও নিশ্চিত নই।
ডিজিয়ার্নি

@ ক্লেটাস: শুভ কল! @ ডিজিয়ার্নি: আমি উত্তরে একটি সংশোধন যুক্ত করেছি যাতে ম্যাচটি পাওয়ার জন্য কিছু স্ট্রো-ম্যান কোড রয়েছে।
ব্রায়ান কাইল

30

নন-রেজেক্স উপায়:

String input = "FOO[BAR]", extracted;
extracted = input.substring(input.indexOf("["),input.indexOf("]"));

বিকল্পভাবে, সামান্য আরও ভাল পারফরম্যান্স / মেমরির ব্যবহারের জন্য (ধন্যবাদ হোসাম):

String input = "FOO[BAR]", extracted;
extracted = input.substring(input.indexOf('['),input.lastIndexOf(']'));

1
আমি lastIndexOf(']')পরিবর্তে ব্যবহার করব , যা নেস্টেড বন্ধনীগুলি পরিচালনা করবে would অতিরিক্ত হিসাবে, আমি বিশ্বাস করি যে indexOf(char)এটির চেয়ে বেশি দ্রুত হবে indexOf(String)
হোসাম অলি

আপনাকে স্বাগতম. পারফরম্যান্স সম্পর্কে আপনার নোটটিও খুব প্রাসঙ্গিক, যেহেতু lastIndexOfবন্ধ বন্ধনীটি খুঁজে পেতে অবশ্যই দ্রুত হবে be
হোসাম অলি

3
তড়িঘড়ি, সূচকগুলি স্ট্রিং ইত্যাদি ইত্যাদি বা রেজিপ্সপ কী দ্রুত?
তোসকান

2
নীচে "উত্তোলিত" -এর জন্য অমিতের মান দেখুন: ইনপুট.ইন্ডেক্সঅফ ('[') + 1
গিগাবাইট

28

এটি একটি কার্যকরী উদাহরণ:

RegexpExample.java

package org.regexp.replace;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexpExample
{
    public static void main(String[] args)
    {
        String string = "var1[value1], var2[value2], var3[value3]";
        Pattern pattern = Pattern.compile("(\\[)(.*?)(\\])");
        Matcher matcher = pattern.matcher(string);

        List<String> listMatches = new ArrayList<String>();

        while(matcher.find())
        {
            listMatches.add(matcher.group(2));
        }

        for(String s : listMatches)
        {
            System.out.println(s);
        }
    }
}

এটি প্রদর্শিত হয়:

value1
value2
value3

6
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public static String get_match(String s, String p) {
    // returns first match of p in s for first group in regular expression 
    Matcher m = Pattern.compile(p).matcher(s);
    return m.find() ? m.group(1) : "";
}

get_match("FOO[BAR]", "\\[(.*?)\\]")  // returns "BAR"

public static List<String> get_matches(String s, String p) {
    // returns all matches of p in s for first group in regular expression 
    List<String> matches = new ArrayList<String>();
    Matcher m = Pattern.compile(p).matcher(s);
    while(m.find()) {
        matches.add(m.group(1));
    }
    return matches;
}

get_matches("FOO[BAR] FOO[CAT]", "\\[(.*?)\\]")) // returns [BAR, CAT]

5

যদি আপনার কেবলমাত্র মধ্যবর্তী যা কিছু পেতে হয় []তবে আপনি এটির \[([^\]]*)\]মতো ব্যবহার করতে পারেন :

Pattern regex = Pattern.compile("\\[([^\\]]*)\\]");
Matcher m = regex.matcher(str);
if (m.find()) {
    result = m.group();
}

আপনার যদি এটি ফর্মের হতে হয় identifier + [ + content + ]তবে আপনি সনাক্তকারী একটি বর্ণানুক্রমিক হলেই আপনি সামগ্রীটি সীমাবদ্ধ করতে পারবেন:

[a-zA-Z][a-z-A-Z0-9_]*\s*\[([^\]]*)\]

এটি উদাহরণস্বরূপ Foo [Bar]বা অন্যান্য জিনিসগুলিকে বৈধতা দেবে myDevice_123["input"]

প্রধান সমস্যাটি

মূল সমস্যাটি হ'ল আপনি যখন এর মতো কোনও বিষয়বস্তু বের করতে চান:

FOO[BAR[CAT[123]]+DOG[FOO]]

রেজেক্স কাজ করবে না এবং ফিরে আসবে BAR[CAT[123এবং FOO
যদি আমরা রেইজেক্সকে \[(.*)\]তখন পরিবর্তন করি তবে আমরা ঠিক আছি তবে তারপরে, আপনি যদি আরও জটিল বিষয়গুলি থেকে সামগ্রীটি বের করার চেষ্টা করছেন তবে:

FOO[BAR[CAT[123]]+DOG[FOO]] = myOtherFoo[BAR[5]]

রিজেক্সগুলির কোনওটিই কাজ করবে না।

সব ক্ষেত্রে যথাযথ সামগ্রী বের করার জন্য সবচেয়ে সঠিক রেইজেক্স অনেক বেশি জটিল হবে কারণ এতে জোড় ভারসাম্য বজায় রাখতে []এবং সেগুলিকে আপনাকে সামগ্রী সরবরাহ করতে হবে give

একটি সহজ সমাধান

যদি আপনার সমস্যাগুলি জটিল হয়ে চলেছে এবং []স্বেচ্ছাসেবকের বিষয়বস্তু হয়ে থাকে তবে আপনি এর পরিবর্তে []জোড়গুলির ভারসাম্য বজায় রাখতে এবং রেজেক্সের চেয়ে প্লেইন পুরাতন কোড রাথের সাহায্যে স্ট্রিংটি বের করতে পারেন:

int i;
int brackets = 0;
string c;
result = "";
for (i = input.indexOf("["); i < str.length; i++) {
    c = str.substring(i, i + 1);
    if (c == '[') {
        brackets++;
    } else if (c == ']') {
        brackets--;
        if (brackets <= 0) 
            break;
    }
    result = result + c;
}   

এটি বাস্তব কোডের চেয়ে সিউডো কোড, আমি জাভা কোডার নই তাই সিনট্যাক্সটি সঠিক কিনা তা আমি জানি না তবে এটির উন্নতি করার পক্ষে যথেষ্ট সহজ হওয়া উচিত।
কী গণনাটি এই কোডটি কাজ করা উচিত এবং আপনাকে এর লিখিত সামগ্রী বের করার অনুমতি দেয় [], তবে তা জটিল।


2

আমি মনে করি আপনার নিয়মিত প্রকাশটি দেখতে এইরকম হবে:

/FOO\[(.+)\]/

ধরে নিই যে এফওও স্থির হতে চলেছে।

সুতরাং, এটি জাভাতে রাখতে:

Pattern p = Pattern.compile("FOO\\[(.+)\\]");
Matcher m = p.matcher(inputLine);

ফুও [বার] এফইও [বাজ] -> আপনার রিজেক্সের সাথে ফিরে আসবে: "বার] এফও [বাজ"
মোহাম্মদ জাফর মাশহাদি

1
String input = "FOO[BAR]";
String result = input.substring(input.indexOf("[")+1,input.lastIndexOf("]"));

এটি প্রথম '[' এবং শেষ ']' এর মধ্যে মানটি ফিরিয়ে দেবে

ফু [বার] => বার

ফু [বার [পরীক্ষা]] => বার [পরীক্ষা]

দ্রষ্টব্য: ইনপুট স্ট্রিংটি ভালভাবে গঠন না করা হয়েছে কিনা তা পরীক্ষা করতে আপনার ত্রুটি যুক্ত করা উচিত।



0

আমি সংজ্ঞা দিয়েছি যে আমি [এবং এর মধ্যে সর্বাধিক সংখ্যক অ-] অক্ষর চাই ]। এগুলি ব্যাকস্ল্যাশগুলি সহ পালাতে হবে (এবং জাভাতে এগুলি আবার পালাতে হবে), এবং অ-] এর সংজ্ঞাটি একটি চরিত্র শ্রেণি, এইভাবে ভিতরে [এবং ](যেমন [^\\]])। ফলাফল:

FOO\\[([^\\]]+)\\]

0

এটির মতো কাজ করুন যদি আপনি কিছু স্ট্রিং পার্স করতে চান যা mYearInDB.toString () = [2013] থেকে আসছে 2013 এটি দেবে 2013

Matcher n = MY_PATTERN.matcher("FOO[BAR]"+mYearInDB.toString());
while (n.find()) {
 extracredYear  = n.group(1);
 // s now contains "BAR"
    }
    System.out.println("Extrated output is : "+extracredYear);

0

এই regexp আমার জন্য কাজ করে:

form\[([^']*?)\]

উদাহরণ:

form[company_details][0][name]
form[company_details][0][common_names][1][title]

আউটপুট:

Match 1
1.  company_details
Match 2
1.  company_details

Http://rubular.com/ এ পরীক্ষিত


0
"FOO[DOG]".replaceAll("^.*?\\[|\\].*", "");

এটি স্কোয়ার বন্ধনীগুলির মধ্যে কেবল স্ট্রিং গ্রহণ করে একটি স্ট্রিং প্রদান করবে।

এটি স্কোয়ার বন্ধনী থেকে সমস্ত স্ট্রিং অপসারণ করে।

আপনি এই জাভা নমুনা কোডটি অনলাইনে পরীক্ষা করতে পারেন: http://tpcg.io/wZoFu0

আপনি এই রেজেক্সটি এখান থেকে পরীক্ষা করতে পারবেন: https://regex101.com/r/oUAzsS/1

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.