Domanda

Voglio analizzare le stringhe, in modo da verificare se hanno specificato la sintassi o meno.

Esempio:

Str = Z344-R565l t

Ecco la mia richiesta è dopo Z ci dovrebbe essere un numero e dopo che un - e dopo che R dovrebbe essere lì seguito da un numero, seguito da l, seguito da uno spazio e poi finalmente t.

Se qualsiasi cosa diversa da ciò che dovrebbe essere un errore.

Devo analizzare molti diversi tipi di sintassi come questo. Sarei scomodo se scrivere una funzione per ogni tipo di sintassi richiesta. Ho sentito che yacc o lex in grado di risolvere questo problema.

Può qualunque si prega di gettare un po 'di luce sul mio problema?

È stato utile?

Soluzione

Usa boost :: regex

#include <string>
#include <boost/regex.hpp>

bool isMatch(std::string input){
    boost::regex r("Z[0-9]*-R[0-9]*l t");
    return boost::regex_search(input, r);
}

L'altra cosa che si potrebbe fare è fornire un elenco di espressioni regex in un file, un'espressione per riga. Creare un vettore di oggetti boost :: regex che utilizzano il file di input e scorrere il vettore di modelli per ogni stringa è necessario per convalidare. Non è molto efficiente ma funzionerà.

Altri suggerimenti

A tale scopo, con una regex.

Z344-R565l t

Il tuo regex dovrebbe essere simile a questo. Non so cosa biblioteca regex da utilizzare per C ++, ma questa è l'espressione regolare generale per assicurarsi che la stringa corrispondente.

Z[0-9]+-R[0-9]+l t

Boost :: Regex va bene se si vuole solo controllare la sintassi. Se si vuole fare in realtà qualcosa quando si legge una tale espressione, vi suggerisco di utilizzare Boost :: Spirito con qualcosa di simile:

rule<> testFormula = 
    (ch_p('Z') >> int_p) 
    >> (ch_p('-')>>ch_p('R')>>int_p>>ch_p('l')) 
    >> space_p >> ch_p('t');

ho isolato parti dell'espressione, che si potrebbe desiderare di connettersi a una certa azione (usando [] operatore).

Vedere la per ulteriori informazioni

Si potrebbe google "runtime parser generation" o qualcosa di simile ...

lex e yacc (o la loro GNU equivaents flex e bison) fanno il loro lavoro in fase di compilazione e non possono essere sufficientemente flessibile per le vostre esigenze. (O possono, non siete molto specifica).

Se si dispone di un compilatore recente (VC 2008 SP1, ecc), non c'è bisogno di usare boost, regex sono parte di TR1 e si possono usare con questa intestazione: #include <regex>

Esempio per una data ( si dovrebbe usare doppia \ come carattere di escape ):

string dateorder = "12/07/2009";

tr1::regex expr("^([1-2][0-9]|0?[1-9]|30|31)/([1-9]|10|11|12)/(2\\\d{3})$");

if (!regex_match(dateorder.begin(),dateorder.end(),expr))
{
    ...
    break;  
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top