输入模板:0+ [0-9] +1 +
输入事件:A,B,C
输入字符串:C7584A7584AC7584A
我试图在输入字符串中找到所有模式(遵循模板)。 “ 0+”和“ 1+”是占位符,可以是事件(A,B,C)中的任何字母。因此模式可以是A + [0-9] + A +,A + [0-9] + B +,A + [0-9] + C +,B + [0-9] + A +,B + [0-9] + B +, B + [0-9] + C +,C + [0-9] + A +,C + [0-9] + B +,C + [0-9] + C +。所有这些正则表达式都对应于DFA,并存储在2D矩阵(3行x 3列)中。
每次找到样式时,都会记录该样式的计数器。同样,每次使用输入字符串中的元素时,DFA只会提供当前状态是否成功。
for (int i = 0; i < input.length; i++) {
int _index = this.events.indexOf((char) input[i]);
if (_index == -1) {
for (int j = 0; j < this.events.length(); j++) {
for (int k = 0; k < this.events.length(); k++) {
dfaMatrix[j][k].startTraversal(input[i]);
dfaMatrix[k][j].startTraversal(input[i]);
}
}
}
else {
for (int j = 0; j < this.events.length(); j++) {
dfaMatrix[_index][j].startTraversal(input[i]);
dfaMatrix[j][_index].startTraversal(input[i]);
if (dfaMatrix[_index][j].isSuccess()) {
count[_index][j] += 1;
flag = true;
break;
} else if (dfaMatrix[j][_index].isSuccess()) {
count[j][_index] += 1;
flag = true;
break;
}
}
if (flag) {
for (int k = 0; k < this.events.length(); k++) {
for (int m = 0; m < this.events.length(); m++) {
dfaMatrix[k][m].reinitialize();
dfaMatrix[m][k].reinitialize();
}
}
flag = false;
for (int j = 0; j < this.events.length(); j++) {
dfaMatrix[_index][j].startTraversal(dfaMatrix[_index][j].getDfat(), input[i]);
dfaMatrix[j][_index].startTraversal(dfaMatrix[j][_index].getDfat(), input[i]);
}
}
}
}
我的预期结果是:
[A][A] : 1
[A][B] : 0
[A][C] : 0
[B][A] : 0
[B][B] : 0
[B][C] : 0
[C][A] : 2
[C][B] : 0
[C][C] : 0
但是我得到了
[A][A] : 2
[A][B] : 0
[A][C] : 0
[B][A] : 0
[B][B] : 0
[B][C] : 0
[C][A] : 1
[C][B] : 0
[C][C] : 0
出于某种原因,当DFA使用第二个C时,DFA不会在逻辑上应该到达错误状态的地方重新初始化。谁能告诉我我要去哪里错了?