newton-allan
asked on
HowTo: Use PCRE with Visual C++?
I want to use PCRE with Visual Studio 6/7/8. My understanding is the latest version of PCRE is 6.4 (but might be 6.6?)
PCRE seems mostly intended for Unix/Linux programmers. The developer seems to have little or no interest in providing nmake or VC++ project files (dsw, dsp, sln, vcproj). I've gotten errors trying to compile/link the pcre files with a demo.cpp file.
I would like a very simple program (with project files) that uses PCRE 6.4 (or later) to do the equivalent of:
// demo.cpp
#include "pcre.h"
#include <stdio.h>
void main(void) {
char str[] = "search within this string to find whether cat is contained";
char subStr[] = "cat";
char replaceStr[] = "dog";
// pcre statement to search str;
// pcre statement to replace cat with dog
printf("%s\n", str);
}
PCRE seems mostly intended for Unix/Linux programmers. The developer seems to have little or no interest in providing nmake or VC++ project files (dsw, dsp, sln, vcproj). I've gotten errors trying to compile/link the pcre files with a demo.cpp file.
I would like a very simple program (with project files) that uses PCRE 6.4 (or later) to do the equivalent of:
// demo.cpp
#include "pcre.h"
#include <stdio.h>
void main(void) {
char str[] = "search within this string to find whether cat is contained";
char subStr[] = "cat";
char replaceStr[] = "dog";
// pcre statement to search str;
// pcre statement to replace cat with dog
printf("%s\n", str);
}
Modified code
void main(void) {
char str[100] = "search within this string to find whether cat is contained";
char tempStr[100];
char subStr[] = "cat";
char replaceStr[] = "dog";
strcpy(tempStr, str);
char* c = strstr(str, subStr);
strcpy(c, replaceStr);
char* c1 = strstr(tempStr, subStr);
strcpy(c + strlen(replaceStr), c1 + strlen(subStr));
printf("%s\n", str);
}
void main(void) {
char str[100] = "search within this string to find whether cat is contained";
char tempStr[100];
char subStr[] = "cat";
char replaceStr[] = "dog";
strcpy(tempStr, str);
char* c = strstr(str, subStr);
strcpy(c, replaceStr);
char* c1 = strstr(tempStr, subStr);
strcpy(c + strlen(replaceStr), c1 + strlen(subStr));
printf("%s\n", str);
}
>> char str[100] = "search within this string to find whether cat is contained";
Give a size to this array. Because if the replaceStr is big then you will get segmentation fault.
Give a size to this array. Because if the replaceStr is big then you will get segmentation fault.
ASKER
Sorry if my question wasn't clear. I know how to use strstr to find the string. That isn't the point of my question. I want to use the PCRE (Perl Compatible Regular Expressions) library to do match/replace that will be MUCH more complicated. The "cat" to "dog" example was just to illustrate.
PCRE library link:
http://www.pcre.org/
The real match/replace is going to be something like Bible scripture references, which are of the form:
BookStringName chapNum:verseNum
so that something like the C/C++ search string:
char str[500] = "The Ten Commandments start at Exodus 20:3 and the Sermon on the Mount starts at Matthew 5:3 and the largest encoding would be Psalm 119:176.";
find: (PlaceHolder_0|Genesis|Exo dus|Leviti cus|...|Ps alm|...|Ma lachi|Matt hew|Mark|. ..|Revelat ion) ([0.9]{1,3}):([0-9]{1,3})
becomes:
"The Ten Commandments start at <ref=2.20.3>Exodus 20:3</ref> and the Sermon on the Mount starts at <ref=40.5.3>Matthew 5:3<ref> and the largest encoding would be <ref=19.119.176>Psalm 119:176</ref>."
Exodus is the 2nd book, so the encoded reference becomes 2.20.3. Matthew is the 40th book, so the encoded reference becomes 40.5.3. Psalm is the 19th book, and so on.
It would have to find the pattern with a ##:## after it .... encountering just Exodus or just Matthew without the ChapNum:VerseNum pattern immediately after it wouldn't be considered a match.
My understanding is that RegEx was made for tasks such as these when strstr isn't adequate. The problem is getting PCRE to build for vc6 or vc7.1. The PCRE developer primarily supports Linux/Unix, and doesn't seem to have much interest in Windows developers.
PCRE library link:
http://www.pcre.org/
The real match/replace is going to be something like Bible scripture references, which are of the form:
BookStringName chapNum:verseNum
so that something like the C/C++ search string:
char str[500] = "The Ten Commandments start at Exodus 20:3 and the Sermon on the Mount starts at Matthew 5:3 and the largest encoding would be Psalm 119:176.";
find: (PlaceHolder_0|Genesis|Exo
becomes:
"The Ten Commandments start at <ref=2.20.3>Exodus 20:3</ref> and the Sermon on the Mount starts at <ref=40.5.3>Matthew 5:3<ref> and the largest encoding would be <ref=19.119.176>Psalm 119:176</ref>."
Exodus is the 2nd book, so the encoded reference becomes 2.20.3. Matthew is the 40th book, so the encoded reference becomes 40.5.3. Psalm is the 19th book, and so on.
It would have to find the pattern with a ##:## after it .... encountering just Exodus or just Matthew without the ChapNum:VerseNum pattern immediately after it wouldn't be considered a match.
My understanding is that RegEx was made for tasks such as these when strstr isn't adequate. The problem is getting PCRE to build for vc6 or vc7.1. The PCRE developer primarily supports Linux/Unix, and doesn't seem to have much interest in Windows developers.
ASKER CERTIFIED SOLUTION
membership
Create a free account to see this answer
Signing up is free and takes 30 seconds. No credit card required.
char* posOfStr = strstr(str, subStr);