Dave's Brain

Browse - Programming Tips - How do I use PCRE?

Date: 2015may31
OS: Linux
Language: C/C++
Keywords: perl compatible regular expressions

Q.  How do I use PCRE?

A.  Here's a simple C++ wrapper

There is also an official C++ wrapper by Google
http://google.com?q=pcrecpp

--- mypcre.h --- #ifndef MY_PCRE_H #define MY_PCRE_H #include <string> #include <string.h> #include <stdlib.h> #include <stdio.h> // For snprintf() #include "pcre.h" class MyPcre { pcre *m_compiled; std::string m_line_to_match; int m_ovector_size; int *m_ovector; pcre_extra *m_extra = NULL; int m_nmatches; public: MyPcre(const int max_matches) { m_ovector_size = max_matches * 3; m_ovector = new int[m_ovector_size]; m_compiled = NULL; m_extra = NULL; m_nmatches = 0; } ~MyPcre() { if (m_ovector != NULL) { delete m_ovector; m_ovector = NULL; } if (m_compiled != NULL) { pcre_free(m_compiled); m_compiled = NULL; } if (m_extra != NULL) { pcre_free(m_extra); m_extra = NULL; } } bool compile(const char *expression) { const char *error = NULL; int erroff; m_compiled = pcre_compile(expression, 0, &error, &erroff, NULL); return m_compiled != NULL; } int exec(const char *line_to_match) { m_line_to_match = line_to_match; m_nmatches = pcre_exec(m_compiled, m_extra, line_to_match, strlen(line_to_match), 0, // Start looking at this point 0, // Options m_ovector, m_ovector_size)); return m_nmatches; } std::string get(const int i) { const char *psubStrMatchStr; pcre_get_substring(m_line_to_match.c_str(), m_ovector, m_nmatches, i, &(psubStrMatchStr)); std::string out = psubStrMatchStr; pcre_free_substring(psubStrMatchStr); return out; } void get(const int i, char *buf, const size_t bufsize) { const int start = m_ovector[2*i]; const int end = m_ovector[2*i+1]; snprintf(buf, bufsize, "%.*s", end - start, m_line_to_match.c_str() + start); } }; #endif
Example Use:
#include "mypcre.h" main() { MyPcre re; if (!re.compile("^([a-zA-Z]+):(.*)$")) { printf("Exprress compile failed\n); exit(1); } int nmatches = rc.exec("Subject: Hello"); if (nmatches <= 0) { printf("No matches\n"); exit(1); } for (int i = 0; i < nmatches; i++) { printf("%d = %s\n", i, re.get(i).c_str()); } }

Add a comment

Sign in to add a comment
Copyright © 2008-2017, dave - Code samples on Dave's Brain is licensed under the Creative Commons Attribution 2.5 License. However other material, including English text has all rights reserved.