παπι Δημοσ. 23 Οκτωβρίου 2017 Δημοσ. 23 Οκτωβρίου 2017 (επεξεργασμένο) RING DATE=1023 TIME=1721 NMBR=6972172948 RING Τι pattern θελει για να βγαλω τις τιμες; Για C# regex. το linefeed ειναι \r\n Επεξ/σία 23 Οκτωβρίου 2017 από παπι
pmav99 Δημοσ. 23 Οκτωβρίου 2017 Δημοσ. 23 Οκτωβρίου 2017 https://regex101.com/r/jWKakB/1 Δεν έχει C# αλλά δεν θα δυσκολευτείς να αλλάξεις τα named groups στη σωστή σύνταξη Άκυρο, στο code generator τελικά έχει και C# και από ότι βλέπω η σύνταξη στη C# είναι η ίδιαhttps://regex101.com/r/jWKakB/1/codegen?language=csharp 1
παπι Δημοσ. 23 Οκτωβρίου 2017 Μέλος Δημοσ. 23 Οκτωβρίου 2017 var regex = new Regex(@"(?<key>.*)=(?<value>.*)", RegexOptions.Multiline); var ma = regex.Matches(str); foreach (Match item in ma) { if(item.Success) { Console.WriteLine("{0} => {1}",item.Groups["key"].Value, item.Groups["value"].Value); } } Το εκανα ετσι, φαινεται να δουλευει. Αλλα, μου μαζευει και τα \r
pmav99 Δημοσ. 23 Οκτωβρίου 2017 Δημοσ. 23 Οκτωβρίου 2017 Ε, δώσε και ένα string.strip()/string.trim() ή όπως το λένε
παπι Δημοσ. 23 Οκτωβρίου 2017 Μέλος Δημοσ. 23 Οκτωβρίου 2017 rdy private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { try { var regex = new Regex(@"(?<key>.*)=(?<value>.*)"); var input = serialPort.ReadExisting(); var matches = regex.Matches(input); foreach (Match match in matches) { if (match.Success) { if (match.Groups["key"].Value.Equals("NMBR")) { IncommingCall?.Invoke(this, new PhoneEventArgs { Number = match.Groups["value"].Value.Trim(), Timestamp = DateTime.Now }); } } } } catch (InvalidOperationException ex) { throw new PhoneException("Serial error:", ex); } catch (Exception ex) { throw new PhoneException("Dafuq happend with the phone???", ex); } } }
k33theod Δημοσ. 23 Οκτωβρίου 2017 Δημοσ. 23 Οκτωβρίου 2017 rdy private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { try { var regex = new Regex(@"(?<key>.*)=(?<value>.*)"); var input = serialPort.ReadExisting(); var matches = regex.Matches(input); foreach (Match match in matches) { if (match.Success) { if (match.Groups["key"].Value.Equals("NMBR")) { IncommingCall?.Invoke(this, new PhoneEventArgs { Number = match.Groups["value"].Value.Trim(), Timestamp = DateTime.Now }); } } } } catch (InvalidOperationException ex) { throw new PhoneException("Serial error:", ex); } catch (Exception ex) { throw new PhoneException("Dafuq happend with the phone???", ex); } } } Τα .* είναι επικίνδυνα κάντο όπως στο link new Regex(@"(?<key>[A-Z]+)=(?<value>/d+)");
Papakaliati Δημοσ. 23 Οκτωβρίου 2017 Δημοσ. 23 Οκτωβρίου 2017 Απο personal experience επειδη ετυχε να δουλευω αυτην την περιοδο με serial port, δεν μπορεις να εμπιστευτεις οτι το serialPort.ReadExisting() θα σου διαβασεις ολα τα δεδομενα με την μια, εκτος και αν χρησιμοποιησεις ενα σχετικα μεγαλο delay timer. Με κατι σε while (!text.includes(/r/n RING)) { appendText = serialPort.ReadExisting() if (timePassed>2000) break; } μπορεις να το κανεις πιο responsive.
defacer Δημοσ. 23 Οκτωβρίου 2017 Δημοσ. 23 Οκτωβρίου 2017 ^ Αυτό ισχύει σίγουρα. Γενικά για πολλά πράγματα (πχ TCP socket) η φάση είναι ότι αν δε λάβεις τα μέτρα σου επειδή δεν υπάρχει εγγύηση, θα δουλεύει σωστά εκτός από όταν αποφασίσει να μη δουλέψει. Ανάλογα τη συχνότητα και τη σοβαρότητα κανονίζεις την πορεία σου. Τυπικά θα χρειαστεί να κάνεις buffering μόνος σου. Το regex τώρα με τον κώδικα που δίνεις γιατί έτσι ρε αγόρι; Ένα απλό @"NMBR=(?<value>\S+)" φαίνεται πολύ βολικότερο.
pmav99 Δημοσ. 23 Οκτωβρίου 2017 Δημοσ. 23 Οκτωβρίου 2017 if (match.Groups["key"].Value.Equals("NMBR"))Αν σε ενδιαφέρουν μόνο τα NMBR μπορείς να κάνεις και match μόνο αυτά. Πχ (?:NMBR=)(?P<number>\d+) https://regex101.com/r/jWKakB/4
παπι Δημοσ. 23 Οκτωβρίου 2017 Μέλος Δημοσ. 23 Οκτωβρίου 2017 ^ Αυτό ισχύει σίγουρα. Γενικά για πολλά πράγματα (πχ TCP socket) η φάση είναι ότι αν δε λάβεις τα μέτρα σου επειδή δεν υπάρχει εγγύηση, θα δουλεύει σωστά εκτός από όταν αποφασίσει να μη δουλέψει. Ανάλογα τη συχνότητα και τη σοβαρότητα κανονίζεις την πορεία σου. Τυπικά θα χρειαστεί να κάνεις buffering μόνος σου. Το regex τώρα με τον κώδικα που δίνεις γιατί έτσι ρε αγόρι; Ένα απλό @"NMBR=(?<value>\S+)" φαίνεται πολύ βολικότερο. Αφου ειναι προφανες, ηθελα και το date και το time, αλλα μετα λεω, δε γαμιεται θα βαλω DateTime.Now usb μοντεμακι ειναι, οταν χτυπαει το τηλ, στελνει RING με καθε χτυπο, και με τον δευτερο στελνει το time/date/nmbr, δεν εχει ογκο. Αλλα δε βαριεσαι, θα βαλω ενα 50ms delay.
defacer Δημοσ. 23 Οκτωβρίου 2017 Δημοσ. 23 Οκτωβρίου 2017 Αν σε ενδιαφέρουν μόνο τα NMBR μπορείς να κάνεις και match μόνο αυτά. Πχ (?:NMBR=)(?P<number>\d+) Η επιλογή να βάλεις non capturing group αντί για positive lookbehind απλά έτυχε ή είχες κάτι κατα νου;
k33theod Δημοσ. 23 Οκτωβρίου 2017 Δημοσ. 23 Οκτωβρίου 2017 Explicit is better than implicit Η λύση που δίνει η regexoμηχανή είναι η σωστή \d+ ή ακόμα πιο explicit για τους αριθμούς [0-9]+ ή ακόμα πιο explicit [0-9]{number_of_digits} και πιο explicit καίγεσαι Τα .* και τα \S* 'μπορεί' να βγάλουν λάθη.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα