代码之家  ›  专栏  ›  技术社区  ›  forest.peterson

trie-reg-exp在char上解析步骤并继续

  •  0
  • forest.peterson  · 技术社区  · 12 年前

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

    问题:reg表达式适用于添加字符或交换?对于char,但如果剩余字符串有错误,则没有到终止叶的有效路径;使得匹配功能是多余的。我试着加了一个“台阶”?char,如果到达了节点向量的末尾,然后遵循该节点的每条路径-只允许此步骤进行一次;导致内存异常;我无法从逻辑上找到它为什么访问范围外的载体——细菌追踪?

    问题:1)正则表达式如何跨过无效的字符并继续使用路径?2) 为什么要把“粘贴”字符换成“?”导致溢出?

    功能:

    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->阿尔法[位置]。。。 具有一个无效位置,该位置要么从下一个节点剩余,要么以某种方式递增 pos+1 向上通过时?

    1 回复  |  直到 12 年前
        1
  •  0
  •   forest.peterson    12 年前

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