কিভাবে দুটি অক্ষরের মধ্যে একটি স্ট্রিং পেতে?


93

আমার একটি স্ট্রিং আছে,

String s = "test string (67)";

আমি 67 নম্বর পেতে চাই যা (এবং) এর মধ্যে স্ট্রিং।

কেউ দয়া করে আমাকে কীভাবে এটি করতে পারেন বলতে পারেন?


4
সেখানে বিভিন্ন উপায় আছে - যতক্ষণ না আপনার কাছে পৌঁছাতে আপনি স্ট্রিং অক্ষর পুনরুক্তি পারে (বা প্রথম সূচী এটি (এবং )এবং সাবস্ট্রিং বা, অধিকাংশ মানুষ কী করবেন, একটি রেগুলার এক্সপ্রেশন ব্যবহার সঙ্গে এটা করতে।
আন্দ্রেয়াস ডলক 26'12

উত্তর:


103

সত্যিই খুব ঝরঝরে RegExp থাকতে পারে তবে আমি সেই জায়গাতেই নুব, সুতরাং পরিবর্তে ...

String s = "test string (67)";

s = s.substring(s.indexOf("(") + 1);
s = s.substring(0, s.indexOf(")"));

System.out.println(s);

4
রেজেক্স পার্সিংয়ের অদ্ভুততা ছাড়াই, আমি মনে করি প্রয়োজনীয় স্ট্রিংটি উত্তোলনের এটি সেরা উপায়।
সত্যতা

4
রেজেক্স আরও বেশি শক্তিশালী এবং আরও কিছু ক্ষেত্রে নিতে পারে, তবে সরলতার জন্য, এটি কাজ করে ...
ম্যাডপ্রোগ্রামার

4
মারাত্মকভাবে, কেন এটি একটি ভোটকে আকর্ষণ করবে? এটা কি কাজ করে না? এটি অপ্স প্রশ্নের উত্তর দেয় না?
ম্যাডপ্রোগ্রামার 19

আমার যদি একাধিক মান থাকে তবে আমি কীভাবে স্ট্রিং ব্যবহার করতে পারি আমার এইরকম স্ট্রিং রয়েছে তা বিবেচনা করে 'this is an example of <how><i have it>'এবং আমাকে '<' এবং '>' এর মধ্যে মান খুঁজে পাওয়া দরকার
বিগ্নেশ

@ বিজেনেশ একটি নিয়মিত অভিব্যক্তি ব্যবহার করুন
ম্যাডপ্রোগ্রামার

74

এই ইস্যুটির একটি খুব কার্যকর সমাধান যা আপনার কাছ থেকে সূচিপত্রগুলি করার প্রয়োজন হয় না তা অ্যাপাচি কমন্স লাইব্রেরি ব্যবহার করে ।

 StringUtils.substringBetween(s, "(", ")");

এই পদ্ধতিটি আপনাকে এমনকি হ্যান্ডলিংকে এমনকি মঞ্জুরি দেয় এমনকি এমন একাধিক সংঘটন থাকলেও যা সূচিপত্র বন্ধের স্ট্রিং খুঁজলে সহজ হবে না।

আপনি এই লাইব্রেরিটি এখান থেকে ডাউনলোড করতে পারেন: https://mvnrepository.com/artifact/org.apache.commons/commons-lang3/3.4


7
substringsBetween(...)আপনি যদি একাধিক ফলাফল প্রত্যাশা করেন তবে তাও রয়েছে , যা আমি খুঁজছিলাম। ধন্যবাদ
কেহান


72

এটি চেষ্টা করুন

String s="test string(67)";
String requiredString = s.substring(s.indexOf("(") + 1, s.indexOf(")"));

সাবস্ট্রিংয়ের জন্য পদ্ধতির স্বাক্ষরটি হ'ল:

s.substring(int start, int end);

30

নিয়মিত অভিব্যক্তি ব্যবহার করে:

 String s = "test string (67)";
 Pattern p = Pattern.compile("\\(.*?\\)");
 Matcher m = p.matcher(s);
 if(m.find())
    System.out.println(m.group().subSequence(1, m.group().length()-1)); 

4
আমার মনে হয় ""। * ব্যবহার করে আপনার এটি একটি লোভী ম্যাচ করা উচিত? পরিবর্তে. অন্যথায়, যদি স্ট্রিংটি "টেস্ট স্ট্রিং (67) এবং (68) এর মতো কিছু করে থাকে তবে এটি" 67) এবং (68) ফিরে আসবে
ছাথনিক প্রকল্প

18

জাভা নিয়মিত এক্সপ্রেশন সমর্থন করে , তবে আপনি যদি ম্যাচগুলি নিষ্ক্রিয় করতে আসলে তাদের ব্যবহার করতে চান তবে এগুলি এক ধরণের জটিল। আমি মনে করি আপনার উদাহরণটিতে স্ট্রিংয়ের সবচেয়ে সহজ উপায়টি হ'ল Stringক্লাসের replaceAllপদ্ধতিতে কেবল নিয়মিত এক্সপ্রেশন সমর্থনটি ব্যবহার করা:

String x = "test string (67)".replaceAll(".*\\(|\\).*", "");
// x is now the String "67"

এই কেবল সবকিছু মুছে ফেলে আপ-টু-এবং-সহ প্রথম (, এবং একই )তারপরে এবং সবকিছু। এটি কেবল বন্ধনীর মধ্যে উপাদান ছেড়ে দেয়।

তবে এর ফলাফল এখনও একটি String। পরিবর্তে আপনি যদি পূর্ণসংখ্যার ফলাফল চান তবে আপনাকে অন্য রূপান্তরটি করতে হবে:

int n = Integer.parseInt(x);
// n is now the integer 67

10

একটি লাইনে, আমি পরামর্শ দিই:

String input = "test string (67)";
input = input.subString(input.indexOf("(")+1, input.lastIndexOf(")"));
System.out.println(input);`

7
String s = "test string (67)";

int start = 0; // '(' position in string
int end = 0; // ')' position in string
for(int i = 0; i < s.length(); i++) { 
    if(s.charAt(i) == '(') // Looking for '(' position in string
       start = i;
    else if(s.charAt(i) == ')') // Looking for ')' position in  string
       end = i;
}
String number = s.substring(start+1, end); // you take value between start and end

7

এটি করার জন্য আপনি অ্যাপাচি প্রচলিত লাইব্রেরির স্ট্রিং ইউটিগুলি ব্যবহার করতে পারেন।

import org.apache.commons.lang3.StringUtils;
...
String s = "test string (67)";
s = StringUtils.substringBetween(s, "(", ")");
....

7
String result = s.substring(s.indexOf("(") + 1, s.indexOf(")"));

4
দয়া করে 4 টি স্পেস ইনডেন্ট করে আপনার কোডটি ফর্ম্যাট করুন। এছাড়াও যারা আপনার এবং যারা .substring.indexOf` অনিশ্চিত তাদের যারা যাচ্ছেন তাদের জন্য আপনার কোডটি কী করে তা ব্যাখ্যা করে আমি আপনার উত্তরটি কিছুটা প্যাড করব ।
বাগগুলি

6

টেস্ট স্ট্রিং test string (67)যা থেকে আপনার কাছে স্ট্রিংটি নেওয়া দরকার যা দুটি স্ট্রিংয়ের মধ্যে বাসা বাঁধে।

String str = "test string (67) and (77)", open = "(", close = ")";

কিছু সম্ভাব্য উপায় তালিকাভুক্ত : সাধারণ জেনেরিক সমাধান:

String subStr = str.substring(str.indexOf( open ) + 1, str.indexOf( close ));
System.out.format("String[%s] Parsed IntValue[%d]\n", subStr, Integer.parseInt( subStr ));

অ্যাপাচি সফটওয়্যার ফাউন্ডেশন commons.lang3

StringUtilsক্লাস substringBetween()ফাংশনটি স্ট্রিং পায় যা দুটি স্ট্রিংয়ের মধ্যে থাকে। কেবল প্রথম ম্যাচই ফিরে আসে।

String substringBetween = StringUtils.substringBetween(subStr, open, close);
System.out.println("Commons Lang3 : "+ substringBetween);

প্রদত্ত স্ট্রিংকে স্ট্রিংয়ের সাথে প্রতিস্থাপন করে যা দুটি স্ট্রিংয়ের মাঝখানে থাকে। #395


নিয়মিত-এক্সপ্রেশন সহ প্যাটার্ন: (\()(.*?)(\)).*

ডট ম্যাচ (প্রায়) কোন ক্যারেক্টার .? = .{0,1}, .* = .{0,}, .+ = .{1,}

String patternMatch = patternMatch(generateRegex(open, close), str);
System.out.println("Regular expression Value : "+ patternMatch);

ইউটিলিটি ক্লাস RegexUtilsএবং কিছু ফাংশন সহ নিয়মিত-এক্সপ্রেশন ।
      Pattern.DOTALL: লাইন টার্মিনেটর সহ যে কোনও চরিত্রের সাথে মেলে।
      Pattern.MULTILINE: ইনপুট ক্রমের শেষে থেকে শুরু করে পুরো স্ট্রিংয়ের সাথে মেলে ।^$

public static String generateRegex(String open, String close) {
    return "(" + RegexUtils.escapeQuotes(open) + ")(.*?)(" + RegexUtils.escapeQuotes(close) + ").*";
}

public static String patternMatch(String regex, CharSequence string) {
    final Pattern pattern  = Pattern.compile(regex, Pattern.DOTALL);
    final Matcher matcher = pattern .matcher(string);

    String returnGroupValue = null;
    if (matcher.find()) { // while() { Pattern.MULTILINE }
        System.out.println("Full match: " + matcher.group(0));
        System.out.format("Character Index [Start:End]«[%d:%d]\n",matcher.start(),matcher.end());
        for (int i = 1; i <= matcher.groupCount(); i++) {
            System.out.println("Group " + i + ": " + matcher.group(i));
            if( i == 2 ) returnGroupValue = matcher.group( 2 );
        }
    }
    return returnGroupValue;
}

স্ট্রিংউটিসগুলি খুব
ব্যবহারযোগ্য

5
public String getStringBetweenTwoChars(String input, String startChar, String endChar) {
    try {
        int start = input.indexOf(startChar);
        if (start != -1) {
            int end = input.indexOf(endChar, start + startChar.length());
            if (end != -1) {
                return input.substring(start + startChar.length(), end);
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return input; // return null; || return "" ;
}

ব্যবহার:

String input = "test string (67)";
String startChar = "(";
String endChar   = ")";
String output = getStringBetweenTwoChars(input, startChar, endChar);
System.out.println(output);
// Output: "67"

4

ব্যবহার Pattern and Matcher

public class Chk {

    public static void main(String[] args) {

        String s = "test string (67)";
        ArrayList<String> arL = new ArrayList<String>();
        ArrayList<String> inL = new ArrayList<String>();

        Pattern pat = Pattern.compile("\\(\\w+\\)");
        Matcher mat = pat.matcher(s);

        while (mat.find()) {

            arL.add(mat.group());
            System.out.println(mat.group());

        }

        for (String sx : arL) {

            Pattern p = Pattern.compile("(\\w+)");
            Matcher m = p.matcher(sx);

            while (m.find()) {

                inL.add(m.group());
                System.out.println(m.group());
            }
        }

        System.out.println(inL);

    }

}

4
পরিবর্তনশীল নামগুলি কথা বলা পদ্ধতিটিকে আরও বন্ধুত্বপূর্ণ করতে পারে।
জোন

3

বিভক্ত পদ্ধতিটি ব্যবহার করার আরেকটি উপায়

public static void main(String[] args) {


    String s = "test string (67)";
    String[] ss;
    ss= s.split("\\(");
    ss = ss[1].split("\\)");

    System.out.println(ss[0]);
}

3

রেগেক্স এবং প্যাটার্ন / ম্যাচার ক্লাসগুলির সাথে এটি করার জন্য আমি সবচেয়ে সাধারণ উপায় পেয়েছি:

String text = "test string (67)";

String START = "\\(";  // A literal "(" character in regex
String END   = "\\)";  // A literal ")" character in regex

// Captures the word(s) between the above two character(s)
String pattern = START + "(\w+)" + END;

Pattern pattern = Pattern.compile(pattern);
Matcher matcher = pattern.matcher(text);

while(matcher.find()) {
    System.out.println(matcher.group()
        .replace(START, "").replace(END, ""));
}

এটি আরও জটিল রেইজেক্স সমস্যার জন্য সহায়তা করতে পারে যেখানে আপনি দুটি সেট অক্ষরের মধ্যে পাঠ্য পেতে চান।


2

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

আমি নিশ্চিত একটি রেইগেক্স লাইব্রেরি আছে বা এটি করার জন্য কিছু আছে।


জাভা নিয়মিত এক্সপ্রেশন সমর্থন করে। কোনও রিজেক্সপ্লেজ 4 লাইব্রেরির দরকার নেই;)
অ্যান্ড্রেস


2

অন্যান্য সম্ভাব্য সমাধান হ'ল এটি ব্যবহার করা lastIndexOfযেখানে এটি অক্ষর বা স্ট্রিংকে পিছন থেকে সন্ধান করবে।

আমার দৃশ্যে, আমি অনুসরণ করেছি Stringএবং আমাকে নিষ্কাশন করতে হয়েছিল<<UserName>>

1QAJK-WKJSH_MyApplication_Extract_<<UserName>>.arc

সুতরাং, indexOfএবং StringUtils.substringBetweenতারা প্রথম থেকেই চরিত্রের সন্ধান শুরু করায় সহায়ক ছিল না।

সুতরাং, আমি ব্যবহার করেছি lastIndexOf

String str = "1QAJK-WKJSH_MyApplication_Extract_<<UserName>>.arc";
String userName = str.substring(str.lastIndexOf("_") + 1, str.lastIndexOf("."));

এবং, এটি আমাকে দেয়

<<UserName>>

1

এটার মতো কিছু:

public static String innerSubString(String txt, char prefix, char suffix) {

    if(txt != null && txt.length() > 1) {

        int start = 0, end = 0;
        char token;
        for(int i = 0; i < txt.length(); i++) {
            token = txt.charAt(i);
            if(token == prefix)
                start = i;
            else if(token == suffix)
                end = i;
        }

        if(start + 1 < end)
            return txt.substring(start+1, end);

    }

    return null;
}

1

এটি একটি সাধারণ ব্যবহারের \D+রেজেক্স এবং কাজ সম্পন্ন।
এটি সংখ্যা বাদে সমস্ত অক্ষর নির্বাচন করে, জটিল করার দরকার নেই

/\D+/

1

কোনও মিল রেজেেক্স না এলে আসল স্ট্রিংটি ফিরে আসবে

var iAm67 = "test string (67)".replaceFirst("test string \\((.*)\\)", "$1");

কোডটিতে ম্যাচ যুক্ত করুন

String str = "test string (67)";
String regx = "test string \\((.*)\\)";
if (str.matches(regx)) {
    var iAm67 = str.replaceFirst(regx, "$1");
}

--- সম্পাদনা ---

আমি https://www.freeformatter.com/java-regex-tester.html#ad- আউটপুট ব্যবহার করে রেগেজ পরীক্ষা করি।

এটি যুক্ত করা ভাল? কম ম্যাচের জন্য * পরে। এটার মতো কিছু:

String str = "test string (67)(69)";
String regx1 = "test string \\((.*)\\).*";
String regx2 = "test string \\((.*?)\\).*";
String ans1 = str.replaceFirst(regx1, "$1");
String ans2 = str.replaceFirst(regx2, "$1");
System.out.println("ans1:"+ans1+"\nans2:"+ans2); 
// ans1:67)(69
// ans2:67
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.