User forums > General (but related to Code::Blocks)
Question about regex flavor
bigbug:
Is there any way to use non-greedy quantifiers in search/replace/testbed?
As you surely know, in wxWidgets there are different flavors of regular expressions. Why doesn't Code::Blocks use the advanced flavor in search/replace/testbed?
MortenMacFly:
--- Quote from: bigbug on December 07, 2006, 12:04:17 pm ---Why doesn't Code::Blocks use the advanced flavor in search/replace/testbed?
--- End quote ---
I believe because advanced isn't POSIX. But it (of course) can be easily implemented.
With regards, Morten
thomas:
--- Quote from: bigbug on December 07, 2006, 12:04:17 pm ---Is there any way to use non-greedy quantifiers in search/replace/testbed?
--- End quote ---
Unluckily, no.
--- Quote from: bigbug on December 07, 2006, 12:04:17 pm ---As you surely know, in wxWidgets there are different flavors of regular expressions. Why doesn't Code::Blocks use the advanced flavor in search/replace/testbed?
--- End quote ---
Code::Blocks is build in Unicode mode (unless you explicitely specify otherwise), so in fact it uses the "builtin" library (at least, that's what the wxWidgets documentation claims). Under Windows, it should even use the builtin library in ANSI builds.
However, as usual, there is a lot of blah blah about nothing. The "builtin" library with its "advanced" functions does nothing but plain normal extended POSIX. If you attempt to use any of the "advanced" functions, you get a regex compile error.
MortenMacFly:
--- Quote from: thomas on December 07, 2006, 02:11:18 pm ---If you attempt to use any of the "advanced" functions, you get a regex compile error.
--- End quote ---
I think he doesn't mean to change the regex flavour of C::B but only for the regex testbed plugin -> thus make it configurable to enable tests against whatever your favorite regex is (which would make sense though...). Of course this applies to wxRegEx only then... maybe... ;-)
...but I'm not sure if I got that part right.
With regards, Morten.
bigbug:
Since the "advanced" flavor is a superset of POSIX, why not use it?
I've done a test by modifying the minimal wx example. It really fails with the default flag "wxRE_EXTENDED", but it works like a charm, if I use the method "Compile" with "wxRE_ADVANCED". Here is the source of the test:
--- Code: ---#include <wx/wx.h>
#include <wx/regex.h>
#include "mondrian.xpm"
const unsigned int wxID_TEST_REGEX = wxID_HIGHEST + 1;
// Declare the application class
class MyApp : public wxApp
{
public:
// Called on application startup
virtual bool OnInit();
};
// Declare our main frame class
class MyFrame : public wxFrame
{
public:
// Constructor
MyFrame(const wxString& title);
// Event handlers
void OnQuit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);
void OnTestRegEx(wxCommandEvent& event);
private:
// This class handles events
DECLARE_EVENT_TABLE()
};
// Give wxWidgets the means to create a MyApp object
IMPLEMENT_APP(MyApp)
// Implements MyApp& wxGetApp()
DECLARE_APP(MyApp)
bool MyApp::OnInit()
{
// Create the main application window
MyFrame *frame = new MyFrame(wxT("Minimal wxWidgets App"));
// Show it
frame->Show(true);
// Start the event loop
return true;
}
MyFrame::MyFrame(const wxString& title)
: wxFrame(NULL, wxID_ANY, title)
{
// Set the frame icon
SetIcon(wxIcon(mondrian_xpm));
// Create a menu bar
wxMenu *fileMenu = new wxMenu;
// The "About" item should be in the help menu
wxMenu *helpMenu = new wxMenu;
helpMenu->Append(wxID_ABOUT, wxT("&About...\tF1"),
wxT("Show about dialog"));
fileMenu->Append(wxID_EXIT, wxT("E&xit\tAlt-X"),
wxT("Quit this program"));
fileMenu->Append(wxID_TEST_REGEX, wxT("&Test wxRegEx"),
wxT("Test wxRegEx"));
// Now append the freshly created menu to the menu bar...
wxMenuBar *menuBar = new wxMenuBar();
menuBar->Append(fileMenu, wxT("&File"));
menuBar->Append(helpMenu, wxT("&Help"));
// ... and attach this menu bar to the frame
SetMenuBar(menuBar);
// Create a status bar just for fun
CreateStatusBar(2);
SetStatusText(wxT("Welcome to wxWidgets!"));
}
// Event table for MyFrame
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(wxID_ABOUT, MyFrame::OnAbout)
EVT_MENU(wxID_EXIT, MyFrame::OnQuit)
EVT_MENU(wxID_TEST_REGEX, MyFrame::OnTestRegEx)
END_EVENT_TABLE()
void MyFrame::OnAbout(wxCommandEvent& event)
{
wxString msg;
msg.Printf(wxT("Hello and welcome to %s"),
wxVERSION_STRING);
wxMessageBox(msg, wxT("About Minimal"),
wxOK | wxICON_INFORMATION, this);
}
void MyFrame::OnTestRegEx(wxCommandEvent& event)
{
wxString s = wxT("ababcbab");
wxRegEx rxTest;
if(!rxTest.Compile(wxT("(.*?)c"), wxRE_ADVANCED))
wxMessageBox(wxT("Compilation failed"), wxT("Error"),
wxOK | wxICON_ERROR, this);
else
{
rxTest.Replace(&s, wxT("\\1"));
wxMessageBox(s, wxT("Success"),
wxOK | wxICON_INFORMATION, this);
}
}
void MyFrame::OnQuit(wxCommandEvent& event)
{
// Destroy the frame
Close();
}
--- End code ---
Edit:
Sorry, I forgot to say, what system and wx versions I used for the test:
Windows XP SP2
wxWidgets-2.6.3 (unicode-monodll)
wxWidgets-2.8.0 RC1 (unicode-monodll)
The test is maybe more clear by using the following code (it will get all befor the first "c", i. e. "abab"):
--- Code: --- wxString s = wxT("ababcbacab");
wxRegEx rxTest;
if(!rxTest.Compile(wxT("(.*?)c.*$"), wxRE_ADVANCED))
wxMessageBox(wxT("Compilation failed"), wxT("Error"),
wxOK | wxICON_ERROR, this);
else
{
rxTest.Replace(&s, wxT("\\1"));
wxMessageBox(s, wxT("Success"),
wxOK | wxICON_INFORMATION, this);
}
--- End code ---
Navigation
[0] Message Index
[#] Next page
Go to full version