セットアップ: 1) リンクされたノードと、リーフで終了する次のノードにリンクするベクトル配列から形成された文字列トライ データベース、2) A) char '*' が文字列の長さの制限がB) char '?' 1 文字のすべてのパスをたどり、有効な場合は残りの文字列パスをたどります。3) reg 式の後、候補文字列は「try」文字列に対する編集距離が測定されます。
問題: reg 式は、文字を追加したり交換したりするのに問題なく動作しますか? char の場合、残りの文字列にエラーがある場合は、終了リーフへの有効なパスがありません。マッチング機能を冗長にする。「ステップオーバー」を追加してみましたか?ノード ベクトルの最後に到達し、そのノードのすべてのパスをたどった場合は char - このステップオーバーは 1 回だけ許可されます。メモリ例外が発生しました。範囲外のベクトルにアクセスしている理由を論理的に見つけることができません-バックトラッキング?
質問: 1) 正規表現はどのように無効な文字をステップオーバーし、パスを続行できますか? 2) 'sticking' char を '?' に交換するのはなぜですか? オーバーフローが発生しますか?
関数:
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
?