trie reg exp parse step over char并继续

时间:2012-09-04 21:00:50

标签: recursion string-matching trie

设置:1)由链接节点形成的字符串trie数据库和链接到叶子终止的下一个节点的向量数组,2)递归正则表达式函数,如果A)char' *'继续沿着所有路径继续,直到达到字符串长度限制,然后继续关闭剩余的字符串路径(如果有效),并且B)char'?'继续沿着所有路径继续1个字符,然后继续保持字符串路径(如果有效)。 3)在reg表达之后,测量候选字符串以针对“尝试”编辑距离进行编辑。字符串。

问题:reg表达式适用于添加字符或交换?对于char,但如果剩余的字符串有错误,那么没有到终止叶子的有效路径;使匹配功能变得多余。我尝试添加一个' step-over' ? char,如果到达节点向量的末尾,然后跟随该节点的每个路径 - 允许此步骤仅一次;导致内存异常;我无法逻辑地找到为什么它正在访问超出范围的向量 - bactracking?

问题:1)正则表达式如何跨越无效的char并继续路径? 2)为什么交换“坚持”' char for'?'导致溢出?

功能:

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

注意:此功能适用于数百个测试字符串,其中包含&#39; *&#39;如果没有使用额外的步进门,那就狂野了

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

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

1 个答案:

答案 0 :(得分:0)

求助:将正则表达式wilds函数组合为匹配函数

中的循环