Regex: Για να βγάλει ένα υπο-string μεταξύ των δύο ετικετών σε μια σειρά

ψήφοι
42

Έχω ένα αρχείο με την ακόλουθη μορφή:

δεδομένων των δεδομένων
Δεδομένα
[Αρχή]
Τα δεδομένα που θέλω
[Τέλος]
Δεδομένα

Θα ήθελα να αρπάξει την Data I wantαπό μεταξύ τους [Start]και [End]ετικέτες χρησιμοποιώντας ένα Regex. Μπορεί κάποιος να μου δείξει πώς αυτό θα μπορούσε να γίνει;

Δημοσιεύθηκε 04/08/2008 στις 14:47
πηγή χρήστη
Σε άλλες γλώσσες...                            


9 απαντήσεις

ψήφοι
63
\[start\](.*?)\[end\]

Zhich'll θέσει το κείμενο στο κέντρο μέσα σε μια σύλληψη.

Απαντήθηκε 04/08/2008 στις 14:52
πηγή χρήστη

ψήφοι
22

\[start\]\s*(((?!\[start\]|\[end\]).)+)\s*\[end\]

Αυτό θα πρέπει να ελπίζουμε μειωθεί η [start]και [end]δεικτών, καθώς και.

Απαντήθηκε 04/08/2008 στις 14:55
πηγή χρήστη

ψήφοι
5
$text ="Data Data Data start Data i want end Data";
($content) = $text =~ m/ start (.*) end /;
print $content;

Είχα ένα παρόμοιο πρόβλημα για λίγο και μπορώ να σας πω αυτή η μέθοδος λειτουργεί ...

Απαντήθηκε 06/10/2012 στις 17:52
πηγή χρήστη

ψήφοι
4

Ενώ μπορείτε να χρησιμοποιήσετε μια κανονική έκφραση για να αναλύσει τα δεδομένα μεταξύ ετικέτες ανοίγματος και κλεισίματος, θα πρέπει να σκεφτείτε πολύ και σκληρά για το αν αυτό είναι ένα μονοπάτι που θέλετε να πάει κάτω. Ο λόγος για αυτό είναι η δυνατότητα των ετικετών για να γεννήσουν: αν ωοτοκίας ετικέτες θα μπορούσε ποτέ να συμβεί ή μπορεί ποτέ να συμβεί, η γλώσσα λέγεται ότι δεν είναι πλέον τακτικό και κανονικές εκφράσεις παύουν να είναι το κατάλληλο εργαλείο για την ανάλυση αυτή.

Πολλές τακτικές εφαρμογές έκφρασης, όπως PCRE ή κανονικές εκφράσεις της Perl, υποστήριξη υπαναχωρήσεις που μπορεί να χρησιμοποιηθεί για να επιτευχθεί αυτό το τραχύ αποτέλεσμα. Αλλά PCRE (σε αντίθεση με perl) δεν υποστηρίζει την απεριόριστη οπισθοδρόμηση, και αυτό μπορεί να προκαλέσει πραγματικά τα πράγματα να σπάσει το παράξενο τρόπο, το συντομότερο έχετε πάρα πολλές ετικέτες.

Υπάρχει ένα πολύ συχνά αναφέρεται θέση blog που ασχολείται με αυτό περισσότερο, http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html (google για αυτό και ελέγξτε τη μνήμη cache τη στιγμή, φαίνεται να έχει κάποια downtime)

Απαντήθηκε 15/09/2008 στις 15:18
πηγή χρήστη

ψήφοι
4

Μια πιο ολοκληρωμένη συζήτηση για τις παγίδες της χρήσης ενός regex για να βρείτε ταιριάζουν ετικέτες μπορεί να βρεθεί στη διεύθυνση: http://faq.perl.org/perlfaq4.html#How_do_I_find_matchi . Ειδικότερα, πρέπει να γνωρίζουν ότι φωλιάζουν ετικέτες πραγματικά ανάγκη ένα ολοκληρωμένο πρόγραμμα ανάλυσης, προκειμένου να ερμηνευθεί σωστά.

Σημειώνεται ότι η ευαισθησία περίπτωση θα πρέπει να απενεργοποιηθεί προκειμένου να απαντήσει στο ερώτημα, όπως αναφέρεται. Στην Perl, αυτό είναι το i τροποποίησης:

$ echo "Data Data Data [Start] Data i want [End] Data" \
  | perl -ne '/\[start\](.*?)\[end\]/i; print "$1\n"'
 Data i want 

Το άλλο κόλπο είναι να χρησιμοποιήσετε το *; ποσοδείκτη που απενεργοποιεί την απληστία του δεν σταματούν αγώνα. Για παράδειγμα, εάν έχετε μια μη-ταίριασμα [τέλος] tag:

Data Data [Start] Data i want [End] Data [end]

τότε μάλλον δεν θέλετε να συλλάβει:

 Data i want [End] Data
Απαντήθηκε 20/08/2008 στις 20:14
πηγή χρήστη

ψήφοι
3

Λοιπόν, αν σας εγγυηθεί ότι κάθε ετικέτα έναρξης ακολουθείται από μια ετικέτα τέλους τότε η επόμενη θα μπορούσε να λειτουργήσει.

\[start\](.*?)\[end\]

Ωστόσο, Αν έχετε περίπλοκο κείμενο όπως το follwoing:

[start] sometext [start] sometext2 [end] sometext [end]

τότε θα αντιμετωπίσετε προβλήματα με regex.

Τώρα το ακόλουθο παράδειγμα θα τραβήξει όλα τα hot links σε μια σελίδα:

'/<a(.*?)a>/i'

Στην παραπάνω περίπτωση μπορούμε να εγγυηθούμε ότι δεν θα υπάρξουν ένθετα περιπτώσεις:

'<a></a>'

Έτσι, αυτό είναι ένα περίπλοκο ζήτημα και δεν μπορεί απλά να λυθεί με μια απλή απάντηση.

Απαντήθηκε 11/05/2009 στις 21:08
πηγή χρήστη

ψήφοι
1

Με Perl, μπορείτε να περιβάλλουν τα δεδομένα που θέλετε με () 's και τραβήξτε το έξω αργότερα, ίσως και άλλες γλώσσες έχουν μια παρόμοια λειτουργία.

if ($s_output =~ /(data data data data START(data data data)END (data data)/) 
{
    $dataAllOfIt = $1;      # 1 full string
    $dataInMiddle = $2;     # 2 Middle Data
    $dataAtEnd = $3;        # 3 End Data
}
Απαντήθηκε 04/08/2008 στις 15:00
πηγή χρήστη

ψήφοι
0

Διαβάζοντας το κείμενο με τις αγκύλες [] δηλαδή [Έναρξη] και [Τέλος] και επικυρώνει τη σειρά με μια λίστα τιμών. jsfiddle http://jsfiddle.net/muralinarisetty/r4s4wxj4/1/

var mergeFields = ["[sitename]",
                   "[daystoholdquote]",
                   "[expires]",
                   "[firstname]",
                   "[lastname]",
                   "[sitephonenumber]",
                   "[hoh_firstname]",
                   "[hoh_lastname]"];       

var str = "fee [sitename] [firstname] \
sdfasd [lastname] ";
var res = validateMeargeFileds(str);
console.log(res);

function validateMeargeFileds(input) {
    var re = /\[\w+]/ig;
    var isValid;
    var myArray = input.match(re);

    try{
        if (myArray.length > 0) {
            myArray.forEach(function (field) {

                isValid = isMergeField(field);

                if (!isValid){
                   throw e;                        
                }
            });
        }
    }
    catch(e) {        
    }

    return isValid;
}

function isMergeField(mergefield) {
    return mergeFields.indexOf(mergefield.toLowerCase()) > -1;
}
Απαντήθηκε 12/09/2014 στις 09:26
πηγή χρήστη

ψήφοι
0

Ανατρέξτε σε αυτό το ερώτημα να αποχωρήσει από το κείμενο μεταξύ των ετικετών με χαρακτήρες διαστήματος και τελείες ( .)

[\S\s] είναι αυτή που χρησιμοποιείται

Regex για να ταιριάζει με κανένα χαρακτήρα, συμπεριλαμβανομένων νέων γραμμών

Απαντήθηκε 28/08/2013 στις 22:12
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more