正则表达式匹配产生意外结果

Posted

技术标签:

【中文标题】正则表达式匹配产生意外结果【英文标题】:regular expression matching producing unexpected result 【发布时间】:2012-03-18 15:06:53 【问题描述】:

这是正则表达式匹配的代码

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int matchhere(char *regexp,char *text);
int matchstar(int c,char *regexp,char *text);
int match(char *regexp,char *text)


    if(regexp[0]=='^')
        return matchhere(regexp+1,text);

    do 
        if(matchhere(regexp,text))
            return 1;


     while(*text++!='\0');

    return 0;


int matchhere(char *regexp,char *text)

    if(regexp[0]='\0')
        return 1;
    if(regexp[1]='*')
        return matchstar(regexp[0],regexp+2,text);

    if(regexp[0]=='$' && regexp[1]=='\0')
        return *text=='\0';
    if(*text!='\0' && regexp[0]=='.' || regexp[0]==*text)
        return matchhere(regexp+1,text+1);
    return 0;


int main()

    char *regexp="^abb";
    char *text="cabbacd";
    cout<<match(regexp,text)<<endl;

    return 0;

int matchstar(int c,char *regexp,char *text)

    do 
        if(matchhere(regexp,text))
            return 1;
    
    while(*text!='\0' && (*text++==c || c=='.'));

    return 0;

它写入运行时错误,调试后,我得到以下结果

+       regexp  0x00365839 "abb"    char *
        regexp[0]   97 'a'  char
+       text    0x00365830 "cabbacd"    char *

为什么?请帮助我,澄清一下,我无法调试更多,因为它给了我窗口的意外错误

【问题讨论】:

为什么要自己匹配?我会说改用 regcomp() 和 regexec()。 函数 matchhereif 条件下有两个赋值,看起来应该是比较。很难相信你的编译器没有警告你。 好吧,这是非常糟糕的代码。 为什么不能在调试器中运行它,或者添加额外的打印语句来跟踪它? 你应该知道最好不要从标题中有错字的书中学习。 【参考方案1】:
if(regexp[0]='\0')
     return 1;
if(regexp[1]='*')

这些分配不仅在逻辑上是错误的,而且是非法的。改变字符串文字是非法的。如果你使用const char*,编译器会为你发现这个问题。

【讨论】:

以上是关于正则表达式匹配产生意外结果的主要内容,如果未能解决你的问题,请参考以下文章

ksh 正则表达式错误'=〜`意外

如何匹配,但排除正则表达式模式?

正则表达式中的断言(assertions)

正则表达式问题 请高手讲解一下

正则表达式-- (?:pattern)与(?=pattern)的区别

正则表达式