একটি স্ট্রিং থেকে নম্বরগুলি কীভাবে বের করবেন এবং কী কীভাবে অ্য্রেস পাবেন?


109

আমার কাছে একটি স্ট্রিং ভেরিয়েবল (মূলত একটি অনবদ্য সংখ্যার সংখ্যাযুক্ত একটি ইংরেজী বাক্য) আছে এবং আমি সমস্ত সংখ্যাটি পূর্ণসংখ্যার অ্যারেতে বের করতে চাই। আমি ভাবছিলাম যে নিয়মিত প্রকাশের সাথে একটি দ্রুত সমাধান আছে?


আমি শানের সমাধান ব্যবহার করেছি এবং এটিকে কিছুটা পরিবর্তন করেছি:

LinkedList<String> numbers = new LinkedList<String>();

Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher(line); 
while (m.find()) {
   numbers.add(m.group());
}

1
সংখ্যাগুলি ফাঁকা স্থান বা অন্যান্য অক্ষর দ্বারা বেষ্টিত? সংখ্যাগুলি কীভাবে বিন্যাস করা হয়, সেগুলি কি হেক্সাডেসিমাল, অষ্টাল, বাইনারি, দশমিক?
বুহাকে সিন্ধি

আমি মনে করি এটি প্রশ্ন থেকে পরিষ্কার ছিল: এটি সংখ্যা সহ একটি ইংরেজি বাক্য। তদুপরি আমি একটি পূর্ণসংখ্যার অ্যারে সম্পর্কে বলছিলাম, তাই আমি যা খুঁজছিলাম তা পূর্ণসংখ্যা ছিল।
জন মানাক

উত্তর:


175
Pattern p = Pattern.compile("-?\\d+");
Matcher m = p.matcher("There are more than -2 and less than 12 numbers here");
while (m.find()) {
  System.out.println(m.group());
}

... প্রিন্ট -2এবং 12


- একটি নেতৃস্থানীয় নেতিবাচক চিহ্নের সাথে মেলে - allyচ্ছিকভাবে। \ d একটি অঙ্কের সাথে মেলে এবং আমাদের জাভা স্ট্রিংয়ের \মতো লিখতে হবে \\। সুতরাং, \ d + 1 বা তার বেশি সংখ্যার সাথে মেলে।


4
আপনার নিয়মিত অভিব্যক্তি ব্যাখ্যা করে আপনি কি উত্তরটির পরিপূরক করতে পারবেন?
অস্কারলাইজ

3
- একটি নেতৃস্থানীয় নেতিবাচক চিহ্নের সাথে মেলে - allyচ্ছিকভাবে। digit d একটি অঙ্কের সাথে মেলে এবং জাভা স্ট্রিংয়ে আমাদের we হিসাবে write লিখতে হবে। সুতরাং, \\ d + আরও 1 টি সংখ্যার সাথে মেলে
শন ওভেন

7
আমি ভাসমান সমর্থন করতে প্যাটার্ন ডটকমপিলে ("-? [\\ d \\।] +") এ আমার অভিব্যক্তি পরিবর্তন করেছি। আপনি অবশ্যই আমাকে পথে নিয়ে যান, থেক্স!
জেলেগ্রান্ড

এই পদ্ধতি সংখ্যার সনাক্ত করে কিন্তু Formated সংখ্যার শনাক্ত করতে পারছে না, যেমন 2,000। যেমন ব্যবহারের জন্য-?\\d+,?\\d+|-?\\d+
মুগোমা জে ওকোম্বা

এটি কেবল একটি একক কমা সমর্থন করে, তাই "2,000,000" মিস করবে। এটি "২,০০" এর মতো স্ট্রিং গ্রহণ করে। যদি কমা বিভাজনকারীদের সমর্থন করা আবশ্যক, তবে: -?\\d+(,\\d{3})*কাজ করা উচিত।
শন ওওন

52

replaceAllজাভা.ং. স্ট্রিং পদ্ধতিটি কী ব্যবহার করবেন :

    String str = "qwerty-1qwerty-2 455 f0gfg 4";      
    str = str.replaceAll("[^-?0-9]+", " "); 
    System.out.println(Arrays.asList(str.trim().split(" ")));

আউটপুট:

[-1, -2, 455, 0, 4]

বিবরণ

[^-?0-9]+
  • [এবং ]একক মিলের জন্য অক্ষরের একটি সেট সীমিত করে, অর্থাত্, কোনও ক্রমে কেবলমাত্র একবার
  • ^সেটটির শুরুতে ব্যবহৃত বিশেষ শনাক্তকারী , সেটটিতে উপস্থিত সমস্ত অক্ষরের পরিবর্তে ডিলিমিট সেটটিতে উপস্থিত না সমস্ত অক্ষরের সাথে মেলে চিহ্নিত করতে ব্যবহৃত হয় ।
  • + এক এবং সীমাহীন সময়ের মধ্যে, যতবার সম্ভব সম্ভব, যতটা সম্ভব ফিরিয়ে দেওয়া
  • -? একটি চরিত্র "-" এবং "?"
  • 0-9 "0" এবং "9" এর মধ্যে সীমার একটি অক্ষর

4
আপনি প্রশ্ন চিহ্ন রাখতে চান কেন? এছাড়াও, এই একইরূপে -একটি সংখ্যা হিসাবে নিজেকে দ্বারা, জিনিষ সঙ্গে বরাবর পছন্দ 9-, ---6এবং 1-2-3
অ্যালান মুর

1
লাইব্রেরিগুলি আমদানি না করেই একটি দুর্দান্ত বিকল্প;)
জিসি.সানাব্রিয়া

18
Pattern p = Pattern.compile("[0-9]+");
Matcher m = p.matcher(myString);
while (m.find()) {
    int n = Integer.parseInt(m.group());
    // append n to list
}
// convert list to array, etc

আপনি প্রকৃতপক্ষে [0-9] with d এর সাথে প্রতিস্থাপন করতে পারেন তবে এতে ডাবল ব্যাকস্ল্যাশ পলায়ন জড়িত রয়েছে, যা পড়া শক্ত করে তোলে।


উপস। শানের নেতিবাচক সংখ্যাগুলি পরিচালনা করে, তাই এটি একটি উন্নতি।
পার্শ্ববর্তী

2
যদি আপনি ব্যবহার খুব পুলিশের ঋণাত্মক সংখ্যা হ্যান্ডেল করা হবে "-? [0-9]"
cegprakash

9
  StringBuffer sBuffer = new StringBuffer();
  Pattern p = Pattern.compile("[0-9]+.[0-9]*|[0-9]*.[0-9]+|[0-9]+");
  Matcher m = p.matcher(str);
  while (m.find()) {
    sBuffer.append(m.group());
  }
  return sBuffer.toString();

এটি দশমিককে ধরে রেখে সংখ্যা তোলার জন্য


নেতিবাচকগুলি পরিচালনা করে না
ওয়ানডে ক্রিকেটার

5

গৃহীত উত্তর সংখ্যাগুলি সনাক্ত করে তবে ফর্ম্যাট করা সংখ্যাগুলি সনাক্ত করতে পারে না, উদাহরণস্বরূপ ২,০০০, না দশমিক, উদাহরণস্বরূপ ৪.৮। যেমন ব্যবহারের জন্য -?\\d+(,\\d+)*?\\.?\\d+?:

        Pattern p = Pattern.compile("-?\\d+(,\\d+)*?\\.?\\d+?");
        List<String> numbers = new ArrayList<String>();
        Matcher m = p.matcher("Government has distributed 4.8 million textbooks to 2,000 schools");
        while (m.find()) {  
            numbers.add(m.group());
        }   
        System.out.println(numbers);

আউটপুট: [4.8, 2,000]


1
@ জুলিয়েন্স: আমি একমত নই। এই রেজেক্স ওপি চেয়েছে এর চেয়ে অনেক বেশি কাজ করে এবং এটি ভুলভাবে করে। (কমপক্ষে, দশমিক অংশটি একটি groupচ্ছিক গ্রুপে থাকা উচিত, যার মধ্যে যা কিছু প্রয়োজন এবং লোভী রয়েছে (?:\.\d+)?।)
অ্যালান মুর

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

@ অ্যালানমুর এসও-তে অনেক দর্শক বিভিন্ন সাদৃশ্য / পার্থক্য নিয়ে সমস্যাগুলি সমাধান করার জন্য যে কোনও / বিভিন্ন উপায় সন্ধান করছেন এবং পরামর্শটি সামনে আনার ক্ষেত্রে এটি সহায়ক। এমনকি ওপি ওভারসিম্প্লিফাইড থাকতে পারে।
মুগোমা জে ওকোম্বা

4

যুক্তিযুক্ত সংখ্যার জন্য এটি ব্যবহার করুন: (([0-9]+.[0-9]*)|([0-9]*.[0-9]+)|([0-9]+))


1
ওপি বাস্তব সংখ্যা নয়, পূর্ণসংখ্যা বলেছিল। এছাড়াও, আপনি বিন্দুগুলি থেকে বাঁচতে ভুলে গিয়েছিলেন, এবং এই প্রথম বন্ধনীগুলির কোনওটিরই প্রয়োজন নেই।
অ্যালান মুর

3

জাভা 8 ব্যবহার করে আপনি এটি করতে পারেন:

String str = "There 0 are 1 some -2-34 -numbers 567 here 890 .";
int[] ints = Arrays.stream(str.replaceAll("-", " -").split("[^-\\d]+"))
                 .filter(s -> !s.matches("-?"))
                 .mapToInt(Integer::parseInt).toArray();
System.out.println(Arrays.toString(ints)); // prints [0, 1, -2, -34, 567, 890]

আপনি ঋণাত্মক সংখ্যার আগে না থাকে তাহলে, আপনি পরিত্রাণ পেতে পারেন replaceAll(এবং ব্যবহারের !s.isEmpty()মধ্যেfilter ), যে ভালো সঠিকভাবে বিভক্ত কিছু একমাত্র যেমন 2-34(এই এছাড়াও বিশুদ্ধরূপে মধ্যে Regex সঙ্গে পরিচালনা করা যায় split, কিন্তু এটা মোটামুটি জটিল)।

Arrays.stream আমাদের চালু String[] পরিণত করে Stream<String>

filterনেতৃস্থানীয় এবং পিছনে থাকা খালি স্ট্রিংগুলির পাশাপাশি কোনও -সংখ্যার অংশ নয় এমন কোনও বিষয় থেকে মুক্তি পেয়ে যায় ।

mapToInt(Integer::parseInt).toArray()আমাদের একটি দিতে parseIntপ্রতিটি কল ।Stringint[]


বিকল্পভাবে, জাভা 9 এর একটি ম্যাচার.প্রসূত পদ্ধতি রয়েছে, যা এর মতো কিছু করার অনুমতি দেয়:

Pattern p = Pattern.compile("-?\\d+");
Matcher m = p.matcher("There 0 are 1 some -2-34 -numbers 567 here 890 .");
int[] ints = m.results().map(MatchResults::group).mapToInt(Integer::parseInt).toArray();
System.out.println(Arrays.toString(ints)); // prints [0, 1, -2, -34, 567, 890]

এটি যেমন দাঁড়িয়েছে, অন্য উত্তরগুলিতে Pattern/ Matcherযেমন ফলাফলগুলি দেখানো হয়েছে কেবলমাত্র লুপিংয়ের চেয়ে এগুলির কোনওটিই বৃহত উন্নতি নয়, তবে আপনি যদি আরও জটিল ক্রিয়াকলাপগুলির সাথে এটি অনুসরণ করতে চান যা ব্যবহারের সাথে উল্লেখযোগ্যভাবে সরলীকৃত হয় তা সহজ হওয়া উচিত it স্রোত বইবে।


1

এটি ব্যবহার করে সমস্ত আসল নম্বরগুলি বের করুন।

public static ArrayList<Double> extractNumbersInOrder(String str){

    str+='a';
    double[] returnArray = new double[]{};

    ArrayList<Double> list = new ArrayList<Double>();
    String singleNum="";
    Boolean numStarted;
    for(char c:str.toCharArray()){

        if(isNumber(c)){
            singleNum+=c;

        } else {
            if(!singleNum.equals("")){  //number ended
                list.add(Double.valueOf(singleNum));
                System.out.println(singleNum);
                singleNum="";
            }
        }
    }

    return list;
}


public static boolean isNumber(char c){
    if(Character.isDigit(c)||c=='-'||c=='+'||c=='.'){
        return true;
    } else {
        return false;
    }
}

1

প্রকৃত সংখ্যা উপস্থাপনের জন্য ভগ্নাংশ এবং গ্রুপিং অক্ষরগুলি ভাষার মধ্যে পৃথক হতে পারে। ভাষার উপর নির্ভর করে একই আসল সংখ্যাটি বিভিন্নভাবে লেখা যেতে পারে।

জার্মানিতে সংখ্যাটি মিলিয়ন

2,000,000.00

এবং ইংরাজীতে

2.000.000,00

একটি ভাষা অজ্ঞাবল পদ্ধতিতে প্রদত্ত স্ট্রিং থেকে সম্পূর্ণরূপে আসল সংখ্যা বের করার একটি পদ্ধতি:

public List<BigDecimal> extractDecimals(final String s, final char fraction, final char grouping) {
    List<BigDecimal> decimals = new ArrayList<BigDecimal>();
    //Remove grouping character for easier regexp extraction
    StringBuilder noGrouping = new StringBuilder();
    int i = 0;
    while(i >= 0 && i < s.length()) {
        char c = s.charAt(i);
        if(c == grouping) {
            int prev = i-1, next = i+1;
            boolean isValidGroupingChar =
                    prev >= 0 && Character.isDigit(s.charAt(prev)) &&
                    next < s.length() && Character.isDigit(s.charAt(next));                 
            if(!isValidGroupingChar)
                noGrouping.append(c);
            i++;
        } else {
            noGrouping.append(c);
            i++;
        }
    }
    //the '.' character has to be escaped in regular expressions
    String fractionRegex = fraction == POINT ? "\\." : String.valueOf(fraction);
    Pattern p = Pattern.compile("-?(\\d+" + fractionRegex + "\\d+|\\d+)");
    Matcher m = p.matcher(noGrouping);
    while (m.find()) {
        String match = m.group().replace(COMMA, POINT);
        decimals.add(new BigDecimal(match));
    }
    return decimals;
}

1

আপনি যদি বার 1 বা aa1bb এর মতো শব্দের মধ্যে থাকা সংখ্যাগুলি বাদ দিতে চান, তবে রেগেক্স ভিত্তিক উত্তরগুলির সাথে শব্দের সীমানা-বি যুক্ত করুন। উদাহরণ স্বরূপ:

Pattern p = Pattern.compile("\\b-?\\d+\\b");
Matcher m = p.matcher("9There 9are more9 th9an -2 and less than 12 numbers here9");
while (m.find()) {
  System.out.println(m.group());
}

প্রদর্শন:

2
12

1

আমি স্ট্রিং থেকে সংখ্যাগুলি বের করতে ASCII মানগুলি পরীক্ষা করার পরামর্শ দিচ্ছি মনে করুন আপনি আমার ইনপুট স্ট্রিংটি myname12345 হিসাবে রেখেছেন এবং যদি আপনি কেবল 12345 নম্বরগুলি বের করতে চান তবে আপনি প্রথমে স্ট্রিংকে অক্ষর অ্যারে রূপান্তর করে তা করতে পারেন তবে নীচের সিউডোকোডটি ব্যবহার করুন

    for(int i=0; i < CharacterArray.length; i++)
    {
        if( a[i] >=48 && a[i] <= 58)
            System.out.print(a[i]);
    }

একবার সংখ্যা বের করা হলে সেগুলি অ্যারেতে যুক্ত করুন

আশাকরি এটা সাহায্য করবে


একটি জাভা স্ট্রিং ইউনিকোড / ইউটিএফ -16 কোড-ইউনিটের ক্রম গণনা করা হয়। ইউটিএফ -16 এর ডিজাইনে প্রথম 128 টি অক্ষরের ASCII এনকোডিংয়ের সমান মান (একই আকার নয়) রয়েছে; এর বাইরে, আপনি এএসসিআইআইয়ের সাথে কথা বলছেন ভেবে ত্রুটি ঘটবে।
টম ব্লডজেট 26'14

0

আমি এই অভিব্যক্তি সবচেয়ে সহজ

String[] extractednums = msg.split("\\\\D++");

-1
public static String extractNumberFromString(String number) {
    String num = number.replaceAll("[^0-9]+", " ");
    return num.replaceAll(" ", "");
}

স্ট্রিং থেকে কেবল সংখ্যা বের করে

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