Click here to Skip to main content
Click here to Skip to main content

DEELX - Regular Expression Engine for C++

By , 25 Dec 2006
 

Downloads for C++

Download Unit for Delphi (statically linked into Delphi project)

Download ActiveX for VB

Download Dynamic Link Version

Introduction

DEELX is a simple regular expression engine coded in pure C++.

All source code of DEELX is just only one single header file (deelx.h). Without any other CPP or lib, you need not create a project alone for DEELX when you want to use it, and also you need not worry about link problems.

DEELX has a good compatibility that it can be compiled by Visual C++ 6.0, 7.1, 8.0 (Windows), gcc(Cygwin), gcc(Linux), gcc(FreeBSD), Turbo C++ 3.0(DOS), C++ Builder(Windows), etc. DEELX is coded using template, so char, wchar_t and other simple types can be used as its base type.

DEELX regular expression engine is the most convenient and easiest engine to use.

Features

DEELX supports PERL compatible regular expression syntax. Besides the basic pattern syntax, DEELX has implemented many extended syntaxes:

  • Right to left match mode
  • Named capture group
  • Remark
  • Zero-width assertion
  • Independent expression
  • Conditional expression
  • Recursive expression
  • Replace operation

Ideas

The most important idea of DEELX is the concept of "Element of Regular Expression". In the source code, I call it "ELX".

I regard every kind of element as "Abstract Element" => "ElxInterface". This ElxInterface has two methods: Match() and MatchNext(). Match() means to try to match the first time. If Match() returns true, but what matched is not what you want, call MatchNext() means to discard the result and try to get another successful match. If the result is still not what you want, go on calling MatchNext() till it returns false or you get what you want.

For example, two elements: (.*)(a)

  1. To call the "Match()" method of the first element(.*) will let it match all the text. But now the second element(a) will fail to match, so the match result of the previous "Match()" is not what I want.
  2. The next step is to call the "MatchNext()" method of the first element(.*). This step is also called "backtrack". The first element(.*) will reduce its repeat times, then the second element(a) will again try to match.
  3. So on, one possible final result is that: even the first element(.*) reduced to zero times, the second element still failed to match, so the overall regular expression failed to match.
  4. Another final result is that: when the first element(.*) reduced to a certain times, the second element succeeded to match, so the overall regular expression succeeded.

Match operations of all kinds of elements can be abstracted into "Match()" and "MatchNext()" operations.

That is DEELX's idea.

Demo in C++

#include "deelx.h"

int main(int argc, char * argv[])
{
    // text
    char * text = "12.5, a1.1, 0.123, 178";

    // declare
    static CRegexpT <char> regexp("\\b\\d+\\.\\d+", IGNORECASE | MULTILINE);

    // loop
    MatchResult result = regexp.Match(text);

    while( result.IsMatched() )
    {
        printf("%.*s\n", result.GetEnd() - result.GetStart(), text + result.GetStart());

        // get next
        result = regexp.Match(text, result.GetEnd());
    }

    return 0;
}

Regex flag definition:

 enum REGEX_FLAGS
 {
  NO_FLAG        = 0,
  SINGLELINE     = 0x01,
  MULTILINE      = 0x02,
  GLOBAL         = 0x04,
  IGNORECASE     = 0x08,
  RIGHTTOLEFT    = 0x10,
  EXTENDED       = 0x20,
 };

Wrap for Delphi (Statically Linked into Delphi Project)

Use Borland C++ Builder to compile DEELX into a .obj file, then link this .obj file into a Delphi Unit: DEELX.dcu.

uses
  DEELX;

var
  result:TMatchResult;
  re:TRegexpA;

begin
  result := TMatchResult.Create();
  re := TRegexpA.Create(Edit1.Text, IGNORECASE + MULTILINE); // the 2nd is 'FLAG's

  re.Match(Edit2.Text, result);

  if result.IsMatched() then
  begin
    Edit2.SelStart := result.GetStart();
    Edit2.SelLength := result.GetEnd() - result.GetStart();
  end
  else
  begin
    Edit2.SelLength := 0;
  end;

  re.Destroy;
  result.Destroy;
end;

Regex flags definition:

const
  NO_FLAG        = $00;
  SINGLELINE     = $01;
  MULTILINE      = $02;
  GLOBAL         = $04;
  IGNORECASE     = $08;
  RIGHTTOLEFT    = $10;
  EXTENDED       = $20;

Wrap to ActiveX for VB

Wrap DEELX to an ActiveX plugin, so DEELX can be used in VB or ASP file.

Private pos As Integer
Private re As New RegExLab.RegExp

Private Sub Command1_Click()
    re.Compile (Text1.Text, "igm") ' the 2nd parameter is 'FLAG's

    re.Match Text2.Text, pos

    If re.IsMatched Then
        pos = re.End
        Text2.SelStart = re.Begin
        Text2.SelLength = re.End - re.Begin
    Else
        pos = -1
        Text2.SelLength = 0
    End If
End Sub

The flags are the same as JScript.Regexp:

  s  -  SINGLELINE
  m  -  MULTILINE
  g  -  GLOBAL
  i  -  IGNORECASE
  r  -  RIGHTTOLEFT
  x  -  EXTENDED

DLL Version of DEELX

The DLL version of deelx uses stdcall format for every function, because Visual Basic can call stdcall only.

The demo.zip contains two projects: one is in Visual Basic, the other is in Delphi.

References and Acknowledgements

Homepage - I'm the author, this is the homepage of DEELX.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

sswater shi
Software Developer (Senior)
China China
Member
Begin coding from basic, since 1994. Interested in coding and database and website constructing.
My website: http://www.regexlab.com/ - Regular Expression Laboratory
The easiest regex engine: http://www.regexlab.com/deelx/

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
Generalfeature requestmembermasotta3 May '11 - 23:09 
GeneralMy vote of 5membermasotta2 May '11 - 22:01 
Generalcapturing all pattern occurrence [modified]memberapple777 Jan '11 - 1:57 
thank you for the dll version and the vb6 demo.
how to capture all the pattern occurrences in the vb6 demo program, such as the string "abc123xba2345", and the pattern "23" is it possible to find the two "23"s without dividing the string.

modified on Wednesday, January 12, 2011 12:14 AM

GeneralRe: capturing all pattern occurrencememberapple7711 Jan '11 - 18:17 
Generalhelp in regexmemberMember 360833026 Jul '10 - 23:45 
GeneralRe: help in regexmembersswater shi27 Jul '10 - 13:02 
QuestionIs there a later version?memberNicholas Kingsley22 Jun '10 - 6:09 
AnswerRe: Is there a later version?membersswater shi27 Jul '10 - 12:58 
GeneralStrangemember_mushr00m_1 Dec '09 - 22:31 
Generalavoid {0} in source code [modified]memberjjshean15 Nov '09 - 22:50 
GeneralMatching some patterns takes too longmemberjjshean24 Oct '09 - 3:58 
GeneralRe: Matching some patterns takes too longmembersswater shi24 Oct '09 - 4:31 
GeneralRe: Matching some patterns takes too longmemberjjshean25 Oct '09 - 11:00 
QuestionHow can I free memory after processing regular match/replace?memberISL08s7 Oct '09 - 2:09 
AnswerRe: How can I free memory after processing regular match/replace? [modified]memberJames 03x7 Oct '09 - 10:44 
GeneralRe: How can I free memory after processing regular match/replace?membersswater shi7 Oct '09 - 17:28 
AnswerRe: How can I free memory after processing regular match/replace?membersswater shi7 Oct '09 - 17:26 
GeneralRe: How can I free memory after processing regular match/replace?memberJames 03x7 Oct '09 - 23:33 
NewsBug foundmemberISL08s3 Oct '09 - 1:28 
GeneralRe: Bug foundmemberISL08s3 Oct '09 - 1:46 
GeneralRe: Bug foundmembersswater shi3 Oct '09 - 5:16 
GeneralRe: Bug foundmemberISL08s4 Oct '09 - 10:53 
GeneralRe: Bug foundmemberISL08s4 Oct '09 - 11:03 
GeneralTrouble Building DLL version with Dev-C++membertriple_eks27 Aug '09 - 13:00 
GeneralRe: Trouble Building DLL version with Dev-C++membersswater shi3 Sep '09 - 4:56 
QuestionCapture BuffersmemberKlaus Fiedler10 May '09 - 17:29 
AnswerRe: Capture Buffersmembersswater shi11 May '09 - 2:16 
GeneralRe: Capture BuffersmemberKlaus Fiedler11 May '09 - 16:05 
NewsInfinite Loopmember[CC]10 Jun '08 - 23:42 
GeneralRe: Infinite Loopmembersswater shi11 Jun '08 - 4:35 
GeneralRe: Infinite Loopmember[CC]12 Jun '08 - 1:49 
GeneralRe: Infinite Loopmembersswater shi12 Jun '08 - 4:13 
GeneralRe: Infinite Loopmember[CC]12 Jun '08 - 22:46 
QuestionFailure while using the deelx.memberhundikamath10 Jun '08 - 5:08 
AnswerRe: Failure while using the deelx.membersswater shi10 Jun '08 - 13:32 
GeneralRe: Failure while using the deelx.memberhundikamath10 Jun '08 - 13:54 
GeneralError on Embedded Visual C++ 4.0memberShindesign29 Apr '08 - 8:23 
GeneralRe: Error on Embedded Visual C++ 4.0membersswater shi30 Apr '08 - 7:11 
QuestionCan it be wrapped into a dll?memberAvis p24 Dec '06 - 21:22 
AnswerRe: Can it be wrapped into a dll?membersswater shi24 Dec '06 - 21:41 
GeneralRe: Can it be wrapped into a dll?memberAvis p24 Dec '06 - 22:25 
GeneralRe: Can it be wrapped into a dll?membersswater shi25 Dec '06 - 20:50 
GeneralRe: Can it be wrapped into a dll?memberAvis p26 Dec '06 - 20:33 
AnswerRe: Can it be wrapped into a dll?membersswater shi27 Dec '06 - 21:08 
QuestionRe: Can it be wrapped into a dll?memberAvis p27 Dec '06 - 22:44 
AnswerRe: Can it be wrapped into a dll?membersswater shi28 Dec '06 - 2:19 
GeneralRe: Can it be wrapped into a dll?memberbob mar27 Dec '06 - 20:39 
GeneralRe: Can it be wrapped into a dll?membersswater shi27 Dec '06 - 21:11 
GeneralRegex Match ToolmemberPhilippe Lhoste27 Oct '06 - 1:39 
GeneralExisting implementations.memberStephen Hewitt12 Oct '06 - 17:46 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web01 | 2.6.130516.1 | Last Updated 26 Dec 2006
Article Copyright 2006 by sswater shi
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid