有限状态机和上下文无关文法是相对应的,其在很多场合都很有用途。
写了一个识别<p>***</p> 的有限状态机的函数:
功能识别所有的开头为<p>结尾为</p>,中间为任意字符的字符串。

private void openFileDelInitialFileAndSaveTargetFile(string filePath,int iCount)
...{
try
...{
int count = 0;
StringBuilder sbToWrite = new StringBuilder();
StreamReader sr = new StreamReader(filePath, System.Text.Encoding.Default);
for (int i = 0; i < 4; i++)
...{
sbToWrite.Append(sr.ReadLine());
sbToWrite.Append(" ");
count++;
}
string content = sr.ReadToEnd();
sr.Close();

==识别用的有限状态机 ==#region ==识别用的有限状态机 ==
Stack finateState = new Stack();
int iStart = 0;
int iStop = 0;
int z = 0;
foreach (char c in content)
...{
if (c == '<' && finateState.Count == 0)
...{
iStart = z;
finateState.Push(c);
z++;
continue;
}
if( (c == 'p'|| c=='P') && finateState.Count == 1)
...{
finateState.Push(c);
z++;
continue;
}
if (finateState.Count == 1)
...{
finateState.Pop();
z++;
continue;
}
if (c == '>' && finateState.Count == 2)
...{
finateState.Push(c);
z++;
continue;
}
if (finateState.Count == 2)
...{
finateState.Clear();
z++;
continue;
}
if (c == '<' && finateState.Count == 3)
...{
finateState.Push(c);
z++;
continue;
}
if (c == '/' && finateState.Count == 4)
...{
finateState.Push(c);
z++;
continue;
}
if (finateState.Count == 4)
...{
finateState.Pop();
z++;
continue;
}

if( (c == 'p'|| c=='P') && finateState.Count == 5)
...{
finateState.Push(c);
z++;
continue;
}
if (finateState.Count == 5)
...{
finateState.Pop();
finateState.Pop();
z++;
continue;
}
if (finateState.Count == 6 && c == '>')
...{
iStop = z;
string tmp = content.Substring(iStart, iStop - iStart+1).Trim();
iStart = 0;
iStop = 0;
sbToWrite.Append(tmp);
sbToWrite.Append(" ");
finateState.Clear();
count++;
z++;
continue;
}
if (finateState.Count == 6)
...{
finateState.Pop();
finateState.Pop();
finateState.Pop();
z++;
continue;
}
z++;
}
#endregion
File.Delete(filePath);
if (count > 4)
...{
int index = filePath.LastIndexOf('.');//dddd:dddf.txt
//filePath = filePath.Substring(0, index);
//filePath += ".txt";
index = filePath.LastIndexOf('/');
filePath = filePath.Substring(0, index);
filePath += "/"+iCount.ToString() + ".txt";
StreamWriter sw = new StreamWriter(filePath, false, Encoding.Default);
sw.Write(sbToWrite.ToString());
sw.Close();
}
}
catch (Exception e)
...{
Console.Write("Error:when try to weite the target file!");
Console.Write(e.Message);
}

}
}

1万+

被折叠的 条评论
为什么被折叠?



