Introducció a l'expressió regular amb C ++ modern

Bloc

Introducció a l'expressió regular amb C ++ modern

Les expressions regulars (o, en resum, l’expressió regular) són un tema molt odiat i menyspreat fins ara amb Modern C ++. Però, al mateix temps, un ús correcte de l’expressió regular pot estalviar-vos escriure moltes línies de codi. Si heu passat prou temps a la indústria. I si no coneixeu l’expressió regular, us perdeu la productivitat del 20-30%. En aquest cas, us recomano que aprengueu l'expressió regular, ja que es tracta d'una inversió única (una cosa similar a aprendre una vegada, escriure a qualsevol lloc filosofia).



/ !: Aquest article s'ha publicat originalment al meu bloc . Si esteu interessats en rebre els meus darrers articles, registreu-vos al meu butlletí .

tv: fxnetworks.com/activate

Inicialment, en aquest article he decidit incloure també la regla general. Però no té sentit, ja que ja hi ha gent / tutorial que funciona millor que jo en l’ensenyament de l’expressió regular. Però, tot i així, vaig deixar una petita secció per tractar Motivació & Regex d'aprenentatge . Durant la resta de l'article, em centraré en la funcionalitat que proporciona C ++ per treballar amb l'expressió regular. I si ja sou conscient de l’expressió regular, podeu utilitzar el mapa mental anterior com a actualització.



Punter : La biblioteca estàndard C ++ ofereix diversos sabors diferents de sintaxi regex, però el sabor per defecte (el que sempre heu d'utilitzar i ho demostro aquí) es va contractar a l'engròs de l'estàndard per a ECMAScript .

Motivació

  • Conec el seu conjunt d'eines patètic i una mica confús. Penseu en el patró de regex següent per a un exemple que extreu el temps en format de 24 hores, és a dir, HH: MM.
([01]?[0-9]|2[0-3]):([0-5]d)
  • Vull dir! Qui vol treballar amb aquest text críptic?
  • I tot el que tingueu en compte és 100% raonable. De fet, He posposat dues vegades l'aprenentatge de l'expressió regular per la mateixa raó . Però, creieu-me, totes les coses que semblen lletges no són tan dolentes.
  • El camí( ) Estic descrivint que aquí no trigarà més de 2-3 hores a aprendre l'expressió regular que és massa intuïtiva. I després d’aprendre-ho, veureu l’efecte agregat amb el retorn de la inversió al llarg del temps.

Regex d'aprenentatge

  • No busqueu molt a Google i intenteu analitzar quin tutorial és el millor. De fet, no perdeu el temps en aquesta anàlisi. Perquè no té sentit fer-ho. En aquest moment (bé, si no coneixeu l’expressió regular), el que realment importa és Començar en lloc de Què és millor !.
  • Només cal anar a https://regexone.com ** sense massa repensament **. I completa totes les lliçons. Confieu en mi aquí, he explorat molts articles, cursos (<=this one is free, BTW) & books. But this is best among all for getting started without losing motivation.
  • I després, si encara teniu ganes de resoldre més problemes i exercicis. Considereu els enllaços següents:
  1. Exercicis a regextutorials.com
  2. Problema de pràctica en l'expressió regular per hackerrank

std :: regex & std :: regex_error Exemple

int main() { try { static const auto r = std::regex(R'()'); // Escape sequence error } catch (const std::regex_error &e) { assert(strcmp(e.what(), 'Unexpected end of regex when escaping.') == 0); assert(e.code() == std::regex_constants::error_escape); } return EXIT_SUCCESS; }
  • Tu veus! estic fent servir literals de cadena crua . També podeu utilitzar la cadena normal. Però, en aquest cas, heu d’utilitzar una doble barra invertida per a una seqüència d’escapament.
  • La implementació actual de std::regex és lent (ja que necessita interpretació de l'expressió regular i creació d'estructures de dades en temps d'execució), inflat i requereix inevitablement una assignació de pila (no és conscient de l'assignador). Tan, vés amb compte si ho fas servir **_std::regex_** en un bucle (vegeu C ++ setmanal - Ep 74 - std :: regex optimize per Jason Turner ). A més, només hi ha una funció membre que crec que pot ser útil std :: regex :: mark_count () que retorna una sèrie de grups de captura.
  • A més, si utilitzeu diverses cadenes per crear un patró de regex en temps d'execució. Aleshores potser ho necessiteu manipulació d’excepcions és a dir std::regex_error per validar-ne la correcció.

std :: regex_search Exemple

int main() { const string input = 'ABC:1-> PQR:2;;; XYZ:3<< '); // All before 1st character match assert(m.suffix().str() == ';; XYZ:3<<<'); // All after last character match // for (string &&str : m) { // Alternatively. You can also do // cout << str << endl; // } } return EXIT_SUCCESS; }
  • smatch són les especialitzacions de std :: match_results que emmagatzema la informació sobre els partits que es recuperaran.

std :: regex_match Exemple

  • Un exemple breu i dolç que sempre podeu trobar a tots els llibres d’expressió regular és la validació del correu electrònic. I aquí és on el nostre std::regex_match la funció s’adapta perfectament.
bool is_valid_email_id(string_view str) static const regex r(R'(w+@w+.(?:com int main() { assert(is_valid_email_id('vishalchovatiya@ymail.com') == true); assert(is_valid_email_id('@abc.com') == false); return EXIT_SUCCESS; }
  • Sé que aquest no és un patró d'expressió regular de validador de correu electrònic a prova completa. Però la meva intenció tampoc no és aquesta.
  • Més aviat us hauríeu de preguntar per què he utilitzat std::regex_match! no std::regex_search! El fonament és simple **_std::regex_match_** coincideix amb tota la seqüència d'entrada .
  • A més, és notable objecte de regex estàtic per evitar construir (compilar / interpretar) un nou objecte de regex cada vegada s'introdueix la funció.
  • La ironia de a sobre del petit fragment de codi és que produeix al voltant de 30.000 línies de muntatge això també amb -O3 bandera. I això és ridícul. Però no us preocupeu, això ja s'ha comunicat a la comunitat ISO C ++. I aviat podrem rebre algunes actualitzacions. Mentrestant, tenim altres alternatives (esmentades al final d’aquest article).

#coding #cpp # regular-expressions #programming #expression



medium.com

Introducció a l'expressió regular amb C ++ modern

Les expressions regulars (o, en resum, l’expressió regular) són un tema molt odiat i menyspreat fins ara amb Modern C ++. Aquest article inclou també regles generals. Per a la resta de l'article, ens centrarem en la funcionalitat que proporciona C ++ per treballar amb l'expressió regular.