0

设置:1)由链接节点形成的字符串树数据库和链接到在叶子中终止的下一个节点的向量数组,2)递归正则表达式函数,如果 A)char '*' 在所有路径中继续下去,直到字符串长度限制为达到,然后继续沿剩余的字符串路径(如果有效)和 B) char '?' 继续向下所有路径 1 个字符,然后继续向下剩余的字符串路径(如果有效)。3) 在 reg 表达式之后,测量候选字符串与 'try' 字符串的编辑距离。

问题:reg 表达式可以很好地添加字符或交换吗?对于 char 但如果剩余的字符串有错误,则没有有效路径到终止叶;使匹配函数变得多余。我尝试添加“跨步”?char 如果到达节点向量的末尾,然后跟随该节点的每条路径 - 只允许此跨步一次;导致内存异常;我无法从逻辑上找到为什么它正在访问超出范围的向量 - 回溯?

问题:1)正则表达式如何跳过无效字符并继续路径?2) 为什么将 'sticking' 字符换成 '?' 导致溢出?

功能:

void Ontology::matchRegExpHelper(nodeT *w, string inWild, Set<string> &matchSet, string out, int level, int pos, int stepover)
{   
    if (inWild=="") {
        matchSet.add(out);
    } else {
        if (w->alpha.size() == pos) {
            int testLength = out.length() + inWild.length(); 
            if (stepover == 0 && matchSet.size() == 0 && out.length() > 8 && testLength == tokenLength) {//candidate generator
                inWild[0] = '?';
                matchRegExpHelper(w, inWild,  matchSet, out, level, 0, stepover+1);
            } else 
                return; //giveup on this path
        }
        if (inWild[0] == '?' || (inWild[0] == '*' && (out.length() + inWild.length() ) == level ) ) { //wild
            matchRegExpHelper(w->alpha[pos].next, inWild.substr(1), matchSet, out+w->alpha[pos].letter, level, 0, stepover);//follow path -> if ontology is full, treat '*' like a '?'
        } else if (inWild[0] == '*')
            matchRegExpHelper(w->alpha[pos].next, '*'+inWild.substr(1), matchSet, out+w->alpha[pos].letter, level, 0, stepover); //keep adding chars
        if (inWild[0] == w->alpha[pos].letter) //follow self
            matchRegExpHelper(w->alpha[pos].next, inWild.substr(1), matchSet, out+w->alpha[pos].letter, level, 0, stepover); //follow char 
        matchRegExpHelper(w, inWild, matchSet, out, level, pos+1, stepover);//check next path
    }
}

错误信息:

+str    "Attempt to access index 1 in a vector of size 1." std::basic_string<char,std::char_traits<char>,std::allocator<char> >
+err    {msg="Attempt to access index 1 in a vector of size 1." } ErrorException

注意:如果不使用额外的跨步门,此函数适用于数百个带有“*”通配符的测试字符串

半解决:我pos < w->alpha.size()在每个调用的路径上设置了一个条件w->alpha[pos]...- 这防止了回溯调用尝试访问具有超出范围索引值的向量。还有其他问题需要解决 - 它无限循环添加 ? 并回溯以将其删除,然后重复。但是,现在继续前进。

修改后的问题:为什么在回溯期间位置索引会累积和/或不递减 - 所以在某些时候它调用 w->alpha[pos]...无效位置,该位置要么从下一个节点保留,要么pos+1在向上传递时以某种方式增加?

4

1 回答 1

0

已解决:将正则表达式 wilds 函数组合为匹配函数中的循环

于 2012-10-01T21:35:23.773 回答