设置: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
向上传时?
答案 0 :(得分:0)
求助:将正则表达式wilds函数组合为匹配函数
中的循环