উত্তর:
আপনার অ-লোভী কোয়ান্টিফায়ার ব্যবহার করতে সক্ষম হওয়া উচিত, বিশেষত * ?. আপনি সম্ভবত নিম্নলিখিতগুলি চাইবেন:
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"
}
নন-রেজেক্স উপায়:
String input = "FOO[BAR]", extracted;
extracted = input.substring(input.indexOf("["),input.indexOf("]"));
বিকল্পভাবে, সামান্য আরও ভাল পারফরম্যান্স / মেমরির ব্যবহারের জন্য (ধন্যবাদ হোসাম):
String input = "FOO[BAR]", extracted;
extracted = input.substring(input.indexOf('['),input.lastIndexOf(']'));
lastIndexOf(']')পরিবর্তে ব্যবহার করব , যা নেস্টেড বন্ধনীগুলি পরিচালনা করবে would অতিরিক্ত হিসাবে, আমি বিশ্বাস করি যে indexOf(char)এটির চেয়ে বেশি দ্রুত হবে indexOf(String)।
lastIndexOfবন্ধ বন্ধনীটি খুঁজে পেতে অবশ্যই দ্রুত হবে be
এটি একটি কার্যকরী উদাহরণ:
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
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]
যদি আপনার কেবলমাত্র মধ্যবর্তী যা কিছু পেতে হয় []তবে আপনি এটির \[([^\]]*)\]মতো ব্যবহার করতে পারেন :
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;
}
এটি বাস্তব কোডের চেয়ে সিউডো কোড, আমি জাভা কোডার নই তাই সিনট্যাক্সটি সঠিক কিনা তা আমি জানি না তবে এটির উন্নতি করার পক্ষে যথেষ্ট সহজ হওয়া উচিত।
কী গণনাটি এই কোডটি কাজ করা উচিত এবং আপনাকে এর লিখিত সামগ্রী বের করার অনুমতি দেয় [], তবে তা জটিল।
আমি মনে করি আপনার নিয়মিত প্রকাশটি দেখতে এইরকম হবে:
/FOO\[(.+)\]/
ধরে নিই যে এফওও স্থির হতে চলেছে।
সুতরাং, এটি জাভাতে রাখতে:
Pattern p = Pattern.compile("FOO\\[(.+)\\]");
Matcher m = p.matcher(inputLine);
String input = "FOO[BAR]";
String result = input.substring(input.indexOf("[")+1,input.lastIndexOf("]"));
এটি প্রথম '[' এবং শেষ ']' এর মধ্যে মানটি ফিরিয়ে দেবে
ফু [বার] => বার
ফু [বার [পরীক্ষা]] => বার [পরীক্ষা]
দ্রষ্টব্য: ইনপুট স্ট্রিংটি ভালভাবে গঠন না করা হয়েছে কিনা তা পরীক্ষা করতে আপনার ত্রুটি যুক্ত করা উচিত।
আমি সংজ্ঞা দিয়েছি যে আমি [এবং এর মধ্যে সর্বাধিক সংখ্যক অ-] অক্ষর চাই ]। এগুলি ব্যাকস্ল্যাশগুলি সহ পালাতে হবে (এবং জাভাতে এগুলি আবার পালাতে হবে), এবং অ-] এর সংজ্ঞাটি একটি চরিত্র শ্রেণি, এইভাবে ভিতরে [এবং ](যেমন [^\\]])। ফলাফল:
FOO\\[([^\\]]+)\\]
এটির মতো কাজ করুন যদি আপনি কিছু স্ট্রিং পার্স করতে চান যা 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);
এই 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/ এ পরীক্ষিত
"FOO[DOG]".replaceAll("^.*?\\[|\\].*", "");
এটি স্কোয়ার বন্ধনীগুলির মধ্যে কেবল স্ট্রিং গ্রহণ করে একটি স্ট্রিং প্রদান করবে।
এটি স্কোয়ার বন্ধনী থেকে সমস্ত স্ট্রিং অপসারণ করে।
আপনি এই জাভা নমুনা কোডটি অনলাইনে পরীক্ষা করতে পারেন: http://tpcg.io/wZoFu0
আপনি এই রেজেক্সটি এখান থেকে পরীক্ষা করতে পারবেন: https://regex101.com/r/oUAzsS/1