我想为普通文本编写一个词法解析器。 所以我需要检测以下令牌:
1)Word 2)数量 3)点和其他标点符号 4)“......”“!?” “!!!”等等
我认为为每个项目编写“if else”条件并非易事。 那么c#是否有任何有限状态机生成器? 我知道ANTLR和其他但我会尝试学习如何使用这些工具,我可以编写自己的“ifelse”FSM。
我希望找到类似的东西:
FiniteStateMachine.AddTokenDefinition(":)","smile");
FiniteStateMachine.AddTokenDefinition(".","dot");
FiniteStateMachine.ParseText(text);
答案 0 :(得分:3)
我建议使用正则表达式。像@"[a-zA-Z\-]+"
这样的东西会拾取单词(a-z和短划线),而@"[0-9]*(\.[0-9]+)?"
会拾取数字(包括十进制数字)。点等类似 - @"[!\.\?]+"
- 你可以在方括号内添加所需的标点符号(用a转义特殊的正则表达式字符)。
Poor man's "lexer" for C#非常接近你所寻找的。我建议谷歌搜索正则表达式的单词和数字或其他任何你需要的东西,找出你需要的表达式。
修改强>:
或者看看Justin对特定正则表达式的回答。
答案 1 :(得分:2)
我们需要了解您认为单词或数字的具体内容。话虽这么说,我假设“单词”的意思是“C#式标识符”,“数字”的意思是“一串基数为10的数字,可能包括(但不是以小数点开头或结尾)。” / p>
根据这些定义,单词将与以下正则表达式匹配:
@"\b(?!\d)\w+\b"
请注意这个would also match unicode。数字符合以下条件:
@"\b\d+(?:\.\d+)?\b"
再次注意,这不包括十六进制,八进制或科学记数法,尽管您可以毫不费力地添加它。它也不包括numeric literal suffixes。
匹配后,你可能会因为标点符号而逃脱:
@"[^\w\d\s]+"