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


169

রুক্ষ আকারে আমার বেশ কয়েকটি স্ট্রিং রয়েছে:

[some text] [some number] [some more text]

আমি জাভা রেগেক্স ক্লাস ব্যবহার করে [কিছু সংখ্যায়] পাঠ্যটি বের করতে চাই।

আমি প্রায় নিয়মিত কোন অভিব্যক্তিটি ব্যবহার করতে চাই তা আমি জানি (যদিও সমস্ত পরামর্শ স্বাগত)। আমি যা সম্পর্কে সত্যিই আগ্রহী তা হ'ল জাভা কলগুলি রেজেক্স স্ট্রিং নেওয়ার জন্য এবং [কিছু সংখ্যার] মান নির্ধারণের জন্য উত্স ডেটাতে এটি ব্যবহার করার জন্য।

সম্পাদনা: আমার যুক্ত করা উচিত যে আমি কেবলমাত্র একটি [কিছু সংখ্যক] (মূলত প্রথম উদাহরণ) এর প্রতি আগ্রহী। উত্সের স্ট্রিংগুলি সংক্ষিপ্ত এবং আমি [কিছু সংখ্যক] একাধিক ঘটনা সন্ধান করতে যাচ্ছি না।


11
... এবং এখন আমি গবেষণা করতে যাচ্ছি। আসুন দেখি এসও আমার নিজের উত্তর বের করার আগে আমার পক্ষে কোনও উত্তর পেতে পারে কিনা। :
ক্রেগ ওয়াকার 21

এটি সফ্টওয়্যার ইঞ্জিনিয়ারিংয়ের জন্য কোনও ব্যাংকিং / বিনিয়োগ / ট্রেডিং সংস্থার একটি সাক্ষাত্কারের প্রশ্ন ছিল না? : পি
এনথে

@ অ্যান্থ নোপ, কাছেও নয়! এটি একটি ছোট-বিজে ওয়েবসাইটে প্রোডাকশন কোডের জন্য ছিল ... অনেক চাঁদ আগে।
ক্রেগ ওয়াকার

উত্তর:


316

সম্পূর্ণ উদাহরণ:

private static final Pattern p = Pattern.compile("^([a-zA-Z]+)([0-9]+)(.*)");
public static void main(String[] args) {
    // create matcher for pattern p and given string
    Matcher m = p.matcher("Testing123Testing");

    // if an occurrence if a pattern was found in a given string...
    if (m.find()) {
        // ...then you can use group() methods.
        System.out.println(m.group(0)); // whole matched expression
        System.out.println(m.group(1)); // first expression from round brackets (Testing)
        System.out.println(m.group(2)); // second one (123)
        System.out.println(m.group(3)); // third one (Testing)
    }
}

যেহেতু আপনি প্রথম সংখ্যাটি সন্ধান করছেন, আপনি এই জাতীয় রিজ এক্সপ ব্যবহার করতে পারেন:

^\D+(\d+).*

এবং m.group(1)আপনাকে প্রথম নম্বরটি ফিরিয়ে দেবে। নোট করুন যে স্বাক্ষরিত সংখ্যায় একটি বিয়োগ চিহ্ন থাকতে পারে:

^\D+(-?\d+).*

62
প্যাটার অবজেক্টটি পুনরায় ব্যবহার করতে ভুলবেন না। প্যাটার সংকলন করতে বিপুল পরিমাণ সময় লাগে।
রাস্তিস্লাভ কোমারা

14
একমত। সাধারণত আমি একটি বেসরকারী স্থিতিশীল চূড়ান্ত প্যাটার্ন PATTERN = Pattern.compile ("...") হিসাবে প্যাটার্নটি সংজ্ঞায়িত করতাম; তবে তা কেবল আমিই।
আল্লায় লালনোদে

6
আমরা কেবল প্যাটার্ন p = Pattern.compile ("\\ d +") ব্যবহার করতে পারি;
javaMan

15
ব্যাখ্যা ছাড়াই এটি একটি জবাব।
মার্টিন স্প্যামার

আপনি ম্যাচারের পুনরায় ব্যবহার করতে পারেন। প্রতিটি ব্যবহারের মধ্যে ম্যাচারের রিসেট () পদ্ধতিটি কল করুন। আপনি যদি একাধিক সমবর্তী থ্রেড জুড়ে ম্যাচার ভাগ করে নিচ্ছেন তবে আপনাকে ক্রিয়াকলাপটি সিঙ্ক্রোনাইজ করা উচিত।
মার্কেজ

41
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Regex1 {
    public static void main(String[]args) {
        Pattern p = Pattern.compile("\\d+");
        Matcher m = p.matcher("hello1234goodboy789very2345");
        while(m.find()) {
            System.out.println(m.group());
        }
    }
}

আউটপুট:

1234
789
2345

প্রশ্নটি বিশেষত কেবল সংখ্যার প্রথম অস্তিত্বের জন্য বলে।
NoBrainer

34

অ্যালাইন মূলত জাভা কোড রয়েছে তাই আপনি এটি ব্যবহার করতে পারেন। তবে, তার সংখ্যাটি কেবল তখনই মেলে যদি আপনার সংখ্যাগুলি কেবলমাত্র অক্ষরের স্ট্রিমের আগে হয় by

"(\\d+)"

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

যদি আপনি এটি ফাঁকা জায়গায় অফসেট হওয়ার প্রত্যাশা করেন তবে এটি নির্দিষ্ট করে এটি আরও বেশি স্বতন্ত্র করে তুলবে

"\\s+(\\d+)\\s+"

আরও ভাল হতে পারে।

আপনার যদি তিনটি অংশই প্রয়োজন হয় তবে এটি করবে:

"(\\D+)(\\d+)(.*)"

সম্পাদনা দ্য প্রকাশ Allain এবং জ্যাক কর্তৃক প্রদত্ত পরামর্শ অনুযায়ী আপনি ক্যাপচার করার জন্য অ-সংখ্যা কিছু উপসেট নির্দিষ্ট করতে হবে ডিজিটের । আপনি যে রেজেক্স ইঞ্জিনটি সন্ধান করছেন \dতা যদি বলেন তবে এটি অঙ্কগুলির আগে সমস্ত কিছু উপেক্ষা করবে। জে বা ক-এর অভিব্যক্তি যদি ফিট আপনার প্যাটার্ন, তারপর পুরো ম্যাচে সমান ইনপুট স্ট্রিং । এবং এটি নির্দিষ্ট করার কোনও কারণ নেই। এটি সম্ভবত একটি পরিচ্ছন্ন মিলাকে ধীর করে দেয়, যদি এটি সম্পূর্ণরূপে উপেক্ষা করা হয় না।


আপনি নমুনা পরীক্ষা চালিয়ে এবং তার বনাম এ / জে সমাধানটির কার্যকারিতা যাচাই করে অ্যাকিম্যানসের হাইপোথিসিস পরীক্ষা করতে পারেন।
অঞ্জনব

আপনার স্ট্রিংয়ের শুরু এবং শেষ নির্দিষ্ট করার দরকার নেই। অন্যথায় 124xxx123xxx এর মতো জিনিসগুলি তার সিনট্যাক্সের সাথে খাপ খায় না এমন কি মিলবে? বা ^ এবং $ অন্তর্ভুক্ত?
আল্লায় লালনোদে

আল্লা, তোমারও ব্যর্থ হবে। আপনি এবং জ্যাক একটি অনুমান করেছেন যে অ-অঙ্কের অক্ষরগুলি সংখ্যার আগে চলে আসবে। তারা হয় না হয় তারা না। কোন ক্ষেত্রে, এই এক্সপ্রেশনগুলির কোনওটিই এই লাইনটিকে বিশ্লেষণ করবে না। আমি পুনরায় উল্লেখ করেছি যে নির্দিষ্ট হিসাবে , অঙ্কগুলির প্যাটার্ন যথেষ্ট।
অ্যাক্সিম্যান

11

প্যাটার্ন ছাড়াও , জাভা স্ট্রিং ক্লাসেও বেশ কয়েকটি পদ্ধতি রয়েছে যা নিয়মিত প্রকাশের সাথে কাজ করতে পারে, আপনার ক্ষেত্রে কোডটি হবে:

"ab123abc".replaceFirst("\\D*(\\d*).*", "$1")

যেখানে \\Dঅ-অঙ্কের অক্ষর।


10

জাভাতে 1.4 এবং তার বেশি:

String input = "...";
Matcher matcher = Pattern.compile("[^0-9]+([0-9]+)[^0-9]+").matcher(input);
if (matcher.find()) {
    String someNumberStr = matcher.group(1);
    // if you need this to be an int:
    int someNumberInt = Integer.parseInt(someNumberStr);
}

8

এই ফাংশনটি স্ট্রিং থেকে সমস্ত মিলের ক্রম সংগ্রহ করে। এই উদাহরণে এটি স্ট্রিং থেকে সমস্ত ইমেল ঠিকানা নেয়।

static final String EMAIL_PATTERN = "[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
        + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})";

public List<String> getAllEmails(String message) {      
    List<String> result = null;
    Matcher matcher = Pattern.compile(EMAIL_PATTERN).matcher(message);

    if (matcher.find()) {
        result = new ArrayList<String>();
        result.add(matcher.group());

        while (matcher.find()) {
            result.add(matcher.group());
        }
    }

    return result;
}

জন্য message = "adf@gmail.com, <another@osiem.osiem>>>> lalala@aaa.pl"এটা 3 উপাদানের তালিকা তৈরি করবে।


3

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

Pattern p = Pattern.compile("^.+(\\d+).+");
Matcher m = p.matcher("Testing123Testing");

if (m.find()) {
    System.out.println(m.group(1));
}

3
-1। কারণ .+লোভজনকভাবে চরিত্রগুলি গ্রাস করে, \d+কেবলমাত্র "3"থেকে ক্যাপচার করে "123"। এছাড়াও, স্ট্রিং লিটারেলের ভিতরে আপনাকে ব্যাকস্ল্যাশ থেকে বাঁচতে হবে (আপনার উদাহরণটি সংকলন করবে না)।
বার্ট কায়ার্স

3

সরল সমাধান

// Regexplanation:
// ^       beginning of line
// \\D+    1+ non-digit characters
// (\\d+)  1+ digit characters in a capture group
// .*      0+ any character
String regexStr = "^\\D+(\\d+).*";

// Compile the regex String into a Pattern
Pattern p = Pattern.compile(regexStr);

// Create a matcher with the input String
Matcher m = p.matcher(inputStr);

// If we find a match
if (m.find()) {
    // Get the String from the first capture group
    String someDigits = m.group(1);
    // ...do something with someDigits
}

একটি ইউটিল ক্লাসে সমাধান

public class MyUtil {
    private static Pattern pattern = Pattern.compile("^\\D+(\\d+).*");
    private static Matcher matcher = pattern.matcher("");

    // Assumptions: inputStr is a non-null String
    public static String extractFirstNumber(String inputStr){
        // Reset the matcher with a new input String
        matcher.reset(inputStr);

        // Check if there's a match
        if(matcher.find()){
            // Return the number (in the first capture group)
            return matcher.group(1);
        }else{
            // Return some default value, if there is no match
            return null;
        }
    }
}

...

// Use the util function and print out the result
String firstNum = MyUtil.extractFirstNumber("Testing4234Things");
System.out.println(firstNum);

1

দেখুন আপনি স্ট্রিং টোকেনাইজার ব্যবহার করে এটি করতে পারেন

String str = "as:"+123+"as:"+234+"as:"+345;
StringTokenizer st = new StringTokenizer(str,"as:");

while(st.hasMoreTokens())
{
  String k = st.nextToken();    // you will get first numeric data i.e 123
  int kk = Integer.parseInt(k);
  System.out.println("k string token in integer        " + kk);

  String k1 = st.nextToken();   //  you will get second numeric data i.e 234
  int kk1 = Integer.parseInt(k1);
  System.out.println("new string k1 token in integer   :" + kk1);

  String k2 = st.nextToken();   //  you will get third numeric data i.e 345
  int kk2 = Integer.parseInt(k2);
  System.out.println("k2 string token is in integer   : " + kk2);
}

যেহেতু আমরা এই সংখ্যাসূচক তথ্যটি তিনটি ভিন্ন ভেরিয়েবলের মধ্যে নিচ্ছি আমরা কোডের যে কোনও জায়গায় এই ডেটা ব্যবহার করতে পারি (আরও ব্যবহারের জন্য)


0

[^\\d]*([0-9]+[\\s]*[.,]{0,1}[\\s]*[0-9]*).*আমি কীভাবে ভাবি এটি ভগ্নাংশের অংশ সহ সংখ্যার যত্ন নেবে। আমি সাদা স্পেসগুলি অন্তর্ভুক্ত করেছি ,এবং সম্ভাব্য বিভাজক হিসাবে অন্তর্ভুক্ত করেছি । আমি ভাসা-গুলিসহ স্ট্রিংয়ের বাইরে নাম্বার বের করার চেষ্টা করছি এবং অ্যাকাউন্টটি বিবেচনায় নিচ্ছি যে ব্যবহারকারী ভুল করতে পারে এবং নম্বর টাইপ করার সময় সাদা স্পেস অন্তর্ভুক্ত করতে পারে।


0

কখনও কখনও আপনি java.lang.String এ উপলব্ধ সহজ .স্প্লিট ("REGEXP") পদ্ধতি ব্যবহার করতে পারেন। উদাহরণ স্বরূপ:

String input = "first,second,third";

//To retrieve 'first' 
input.split(",")[0] 
//second
input.split(",")[1]
//third
input.split(",")[2]

0
Pattern p = Pattern.compile("(\\D+)(\\d+)(.*)");
Matcher m = p.matcher("this is your number:1234 thank you");
if (m.find()) {
    String someNumberStr = m.group(2);
    int someNumberInt = Integer.parseInt(someNumberStr);
}

1
আরও তথ্যের সাথে সম্পাদনা করুন। কেবল-কোড এবং "এটি চেষ্টা করুন" উত্তরগুলি নিরুৎসাহিত করা হয়েছে, কারণ সেগুলিতে কোনও অনুসন্ধানযোগ্য সামগ্রী নেই এবং কারও "কেন এটি চেষ্টা করা উচিত" তা ব্যাখ্যা করবেন না। আমরা এখানে জ্ঞানের উত্স হতে চেষ্টা করি।
ব্রায়ান টম্পসেট -:

1
কোনও অতিরিক্ত মান যোগ না করেই দীর্ঘ সময় আগে দেওয়া হয়েছে এমন সঠিক উত্তরগুলি পুনরাবৃত্তি করার জন্য ডাউনভোট
ফোরেজ

-1

আপনি যদি ফাইল থেকে পড়েন তবে এটি আপনাকে সহায়তা করতে পারে

              try{
             InputStream inputStream = (InputStream) mnpMainBean.getUploadedBulk().getInputStream();
             BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
             String line;
             //Ref:03
             while ((line = br.readLine()) != null) {
                if (line.matches("[A-Z],\\d,(\\d*,){2}(\\s*\\d*\\|\\d*:)+")) {
                     String[] splitRecord = line.split(",");
                     //do something
                 }
                 else{
                     br.close();
                     //error
                     return;
                 }
             }
                br.close();

             }
         }
         catch (IOException  ioExpception){
             logger.logDebug("Exception " + ioExpception.getStackTrace());
         }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.