Sorry, I didn't qualify my problem correctly. The problem comes in when the column list is too long, opposite of what you tested. Also, I doubt the problem is duplicable in such certain conditions, so if you want to try the full program, it will take about 5 minutes to download and test and then try the same test, except with the gibberish in the first ()'s and not the second ()'s.
I tried to look at your code, but can't compile because of:
#include <xmlparse.h>
whatever that is.
If you want me to look at this, can you please try and boil it down to a reproducable test case, or failing that mail me a .zip file
containing everything needed to build the app, plus a text file containing the input that demonstrates the problem. Remember that I'm likely to be building on Win32 not linux: I know next to nothing about debugging gcc built apps, so there's no mileage to be gained by me trying to do
This test is completely stripped down, should work for you on Win32, and still reproduces the problem: #include <iostream> #include <string> #include <boost/regex.hpp> using namespace std; using namespace boost; const string re_ID = "[\\w\\-]+"; const string re_TYPES = "int|decimal|datetime|varchar"; const string re_BASIC_COLDEF = "(_ID_) (_TYPES_)( not null)?( unique)?( default ((\\d+(\\.\\d+)?)|(\"[^\"]*\")))?( unique)?"; const string re_EXT_COLDEF = re_BASIC_COLDEF+"( first| after (_ID_))?"; string replaceStr(string Source, const string& Find, const string& Replacement) { string::size_type Length = Find.length(); string::size_type ReplacementLength = Replacement.length(); string::size_type Pos = 0; while((Pos = Source.find(Find,Pos)) != string::npos) { Source.replace(Pos,Length,Replacement); Pos += ReplacementLength; } return Source; } string replaceMacros(string reg) { return(replaceStr(replaceStr(replaceStr(replaceStr(replaceStr (reg," ","\\s+"),"_COL_",re_BASIC_COLDEF),"_ECOL_",re_EXT_COLDEF),"_I D_",re_ID),"_TYPES_",re_TYPES)); } int main() { string sql = "insert into test (vklajsfkljsdfkjsldfsdjkfdslklfsdjklfsjfsd) values (1)"; string checks[] = { /* 0 */ "create table (_ID_) (\\(((\\s*,? \\s*_COL_\\s*)+)\\))", /* 1 */ "show tables", /* 2 */ "drop table (_ID_)", /* 3 */ "show database", /* 4 */ "desc( table)? (_ID_)", /* 5 */ "alter table (_ID_) add( column)? (_ECOL_)", /* 6 */ "alter table (_ID_) drop( column)? (_ID_)", /* 7 */ "alter table (_ID_) add( column)? \\(((\\s*,?\\s*_ECOL_\\s*)+)\\)", /* 8 */ "rename table (_ID_) (to|as) (_ID_)", /* 9 */ "alter table (_ID_) alter( column)? (_ID_) (set default ((\\d+(\\.\\d+)?)|(\"[^\"]*\"))|drop default)", /* 10 */ "alter table (_ID_) modify( column)? (_COL_)", /* 11 */ "alter table (_ID_) change( column)? (_ID_) (_COL_)", /* 12 */ "alter table (_ID_) rename( to| as) (_ID_)", /* 13 */ "insert( into)? (_ID_)( \\(((\\s*,?\\s* (_ID_)\\s*)+)\\))? values \\(((\\s*,?\\s*((\\d+(\\.\\d+)?)|(\"[^\"] *\"))\\s*)+)\\)" }; int checksLength = sizeof checks / sizeof *checks; int i; for(i=0;i<checksLength;i++) { checks[i] = "^(\\s*"+replaceMacros(checks[i]) +"\\s*;?)$"; } RegEx sqlRegex; for(i=0;i<checksLength;i++) { sqlRegex.SetExpression(checks[i],true); if(sqlRegex.Match(sql)) { break; } } cout << "Finished." << endl; return 0; } If you change the "sql" string to match any other of the 12 cases, they work fine. Only with the last case does it not work. Again, thanks a lot for your time, Kevin --- In Boost-Users@y..., "John Maddock" <john_maddock@c...> wrote: privately that
rather than you.
John Maddock http://ourworld.compuserve.com/homepages/john_maddock/index.htm