जावा रेगेक्स लंबे लॉग में विशिष्ट मान निकालता है

Oct 27 2020

मेरे पास एक बहुत लंबा पाठ है और मैं कुछ विशिष्ट मूल्यों को निकाल रहा हूं जो कुछ विशेष शब्दों के बाद हैं। यहाँ मेरे लंबे पाठ का एक उदाहरण है:

.........
FPS(FramesPerSecond)[ValMin: 29.0000, ValMax: 35.000]
.........
TotalFrames[ValMin: 100000, ValMax:200000]
.........
MemoryUsage(In MB)[ValMin:190000MB, ValMax:360000MB]
.........

यहाँ मेरा कोड है:

File file = filePath.toFile();
        JSONObject jsonObject = new JSONObject();
String FPSMin="";
String FPSMax="";
String TotalFramesMin="";
String TotalFramesMax="";
String MemUsageMin="";
String MemUsageMax="";

String log = "my//log//file";

        final Matcher matcher = Pattern.compile("FPS/\(FramesPerSecond/\)/\[ValMin:");
        if(matcher.find()){
            FPSMin= matcher.end().trim();
        }

लेकिन मैं यह काम नहीं कर सकता। मैं गलत कहाँ हूँ? मूल रूप से मुझे प्रत्येक स्ट्रिंग के लिए, उस लंबे पाठ से आने वाले संगत मान (अधिकतम और न्यूनतम) के लिए चयन करने की आवश्यकता है, और उन्हें चर में संग्रहीत करें। पसंद

FPSMin = 29.0000
FPSMax = 35.0000
FramesMin = 100000
Etc 

धन्यवाद

संपादित करें: मैंने निम्नलिखित कोड की कोशिश की (परीक्षण मामले में) यह देखने के लिए कि क्या समाधान काम कर सकता है, लेकिन मैं मुद्दों का सामना कर रहा हूं क्योंकि मैं एक वस्तु को छोड़कर कुछ भी प्रिंट नहीं कर सकता। यहाँ कोड है:

 @Test
    public void whenReadLargeFileJava7_thenCorrect()
            throws IOException, URISyntaxException {
        Scanner txtScan = new Scanner("path//to//file//test.txt");


        String[] FPSMin= new String[0];
        String FPSMax= "";
  
//Read File Line By Line
        while (txtScan.hasNextLine())   {
            // Print the content on the console
            String str = txtScan.nextLine();
            Pattern FPSMin= Pattern.compile("^FPS\\(FramesPerSecond\\)\\[ValMin:");
            Matcher matcher = FPSMin.matcher(str);

            if(matcher.find()){
                String MinMaxFPS= str.substring(matcher.end(), str.length()-1);
                String[] splitted = MinMaxFPS.split(",");
                FPSMin= splitted[0].split(": ");
                FPSMax = splitted[1];

            }

            System.out.println(FPSMin);
            System.out.println(FPSMax);

        }

जवाब

A.Ktns Oct 27 2020 at 15:51

शायद आपका पैटर्न ऐसा होना चाहिए ^FPS\\(FramesPerSecond\\)\\[ValMin:। मैंने इसकी कोशिश की है और यह मेरे लिए काम करता है।

    String line = "FPS(FramesPerSecond)[ValMin: 29.0000, ValMax: 35.000]";
    
    Pattern pattern = Pattern.compile("^FPS\\(FramesPerSecond\\)\\[ValMin:");
    
    Matcher matcher = pattern.matcher(line);
    
    if (matcher.find()) {
        
        System.out.println(line.substring(matcher.end(), line.length()-1));
        
    }
}

इस तरह, आपको उस लाइन की ऑफसेट मिल जाती है जिसे आप डेटा निकालना चाहते हैं और सबस्ट्रिंग फ़ंक्शन का उपयोग करके आप ऑफसेट से शुरू होने वाले सभी वर्णों को लाइन -1 के आकार तक प्राप्त कर सकते हैं (क्योंकि आप न चाहते हुए भी] चरित्र] प्राप्त कर सकते हैं

PeterWalser Oct 27 2020 at 16:27

निम्नलिखित नियमित अभिव्यक्ति मैच और नाम, मिनट और अधिकतम पर कब्जा करेगी:

Pattern.compile("(.*)\\[.+:\\s*(\\d+(?:\\.\\d+)?)[A-Z]*,.+:\\s*(\\d+(?:\\.\\d+)?)[A-Z]*\\]");

उपयोग (पकड़े गए समूहों को हटाते हुए):

String input = (".........\n" +
        "FPS(FramesPerSecond)[ValMin: 29.0000, ValMax: 35.000]\n" +
        ".........\n" +
        "TotalFrames[ValMin: 100000, ValMax:200000]\n" +
        ".........\n" +
        "MemoryUsage(In MB)[ValMin:190000MB, ValMax:360000MB]\n" +
        ".........");

for (String s : input.split("\n")) {
    Matcher matcher = pattern.matcher(s);
    if (matcher.matches()) {
        System.out.println(matcher.group(1) + ", " + matcher.group(2) + ", " + matcher.group(3));
    }
}

आउटपुट:

एफपीएस (फ्रेम्सपेरेकॉन्ड), 29.0000, 35.000
TotalFrames, 100000, 200000
मेमोरीयूज (एमबी में), 190000, 360000