Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)
RING

            DATE=1023

            TIME=1721

            NMBR=6972172948
            

            RING

Τι pattern θελει για να βγαλω τις τιμες; Για C# regex. το linefeed ειναι \r\n

Επεξ/σία από παπι
Δημοσ.
 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

Δημοσ.

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);
            }
        }
        
    }
Δημοσ.

 

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+)");

Δημοσ.

Απο personal experience επειδη ετυχε να δουλευω αυτην την περιοδο με serial port, δεν μπορεις να εμπιστευτεις οτι το

serialPort.ReadExisting() 

θα σου διαβασεις ολα τα δεδομενα με την μια, εκτος και αν χρησιμοποιησεις ενα σχετικα μεγαλο delay timer.

 

Με κατι σε 

 

while (!text.includes(/r/n RING))

{

     appendText = serialPort.ReadExisting()

   

     if (timePassed>2000)

        break;

}

 

μπορεις να το κανεις πιο responsive.

Δημοσ.

^ Αυτό ισχύει σίγουρα. Γενικά για πολλά πράγματα (πχ TCP socket) η φάση είναι ότι αν δε λάβεις τα μέτρα σου επειδή δεν υπάρχει εγγύηση, θα δουλεύει σωστά εκτός από όταν αποφασίσει να μη δουλέψει. Ανάλογα τη συχνότητα και τη σοβαρότητα κανονίζεις την πορεία σου. Τυπικά θα χρειαστεί να κάνεις buffering μόνος σου.

 

Το regex τώρα με τον κώδικα που δίνεις γιατί έτσι ρε αγόρι; Ένα απλό @"NMBR=(?<value>\S+)" φαίνεται πολύ βολικότερο.

Δημοσ.

^ Αυτό ισχύει σίγουρα. Γενικά για πολλά πράγματα (πχ TCP socket) η φάση είναι ότι αν δε λάβεις τα μέτρα σου επειδή δεν υπάρχει εγγύηση, θα δουλεύει σωστά εκτός από όταν αποφασίσει να μη δουλέψει. Ανάλογα τη συχνότητα και τη σοβαρότητα κανονίζεις την πορεία σου. Τυπικά θα χρειαστεί να κάνεις buffering μόνος σου.

 

Το regex τώρα με τον κώδικα που δίνεις γιατί έτσι ρε αγόρι; Ένα απλό @"NMBR=(?<value>\S+)" φαίνεται πολύ βολικότερο.

Αφου ειναι προφανες, ηθελα και το date και το time, αλλα μετα λεω, δε γαμιεται θα βαλω DateTime.Now

 

usb μοντεμακι ειναι, οταν χτυπαει το τηλ, στελνει RING με καθε χτυπο, και με τον δευτερο στελνει το time/date/nmbr, δεν εχει ογκο. Αλλα δε βαριεσαι, θα βαλω ενα 50ms delay.

Δημοσ.

Αν σε ενδιαφέρουν μόνο τα NMBR μπορείς να κάνεις και match μόνο αυτά. Πχ

(?:NMBR=)(?P<number>\d+)

 

Η επιλογή να βάλεις non capturing group αντί για positive lookbehind απλά έτυχε ή είχες κάτι κατα νου;

Δημοσ.

Explicit is better than implicit 

Η λύση που δίνει η regexoμηχανή είναι η σωστή \d+ ή ακόμα πιο explicit για τους αριθμούς [0-9]+

ή ακόμα πιο explicit [0-9]{number_of_digits} και πιο explicit καίγεσαι :-)

Τα .* και τα \S* 'μπορεί' να βγάλουν λάθη.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...