2

通常のテキスト用の語彙パーサーを書きたいと思っています。したがって、次のトークンを検出する必要があります。

1) 単語 2) 数字 3) ドットおよびその他の句読点 4) 「...」 「!?」「!!!」等々

項目ごとに if else 条件を書くのは簡単ではないと思います。c# 用の有限ステート マシン ジェネレーターはありますか? 私は ANTLR などを知っていますが、これらのツールの使用方法を学ぼうとしている間に、独自の「ifelse」FSM を作成できます。

私は次のようなものを見つけたいと思っています:

FiniteStateMachine.AddTokenDefinition(":)","smile");
FiniteStateMachine.AddTokenDefinition(".","dot");
FiniteStateMachine.ParseText(text);
4

2 に答える 2

3

正規表現を使用することをお勧めします。のようなもの@"[a-zA-Z\-]+"は単語 (az とダッシュ)@"[0-9]*(\.[0-9]+)?"をピックアップし、数値 (10 進数を含む) をピックアップします。ドットなども同様@"[!\.\?]+"で、必要な句読点を角かっこ内に追加するだけです (特別な正規表現文字を でエスケープします)。

貧弱な C# の「レクサー」は、レクサーであるという点で、探しているものに非常に近いものです。単語や数字の正規表現、または必要な表現を見つけるために必要なものをグーグルで検索することをお勧めします。

編集

または、特定の正規表現に対するジャスティンの回答を参照してください。

于 2012-06-10T16:16:54.413 に答える
2

単語や数字を何と見なすかについての詳細を知る必要があります。そうは言っても、「単語」は「C# スタイルの識別子」を意味し、「数字」は「10 進数の文字列であり、小数点を含む (ただし、小数点で始まるまたは終わるものではない)」ことを意味すると仮定します。

これらの定義では、単語は次の正規表現に一致するものになります。

@"\b(?!\d)\w+\b"

これは unicode にも一致することに注意してください。数値は次のようになります。

@"\b\d+(?:\.\d+)?\b"

これは 16 進数、8 進数、または科学的表記法をカバーしていないことに注意してください。ただし、それほど困難なく追加できます。また、数値リテラルの接尾辞も対象外です。

それらを一致させた後、おそらくこれで句読点を回避できます。

@"[^\w\d\s]+"
于 2012-06-10T16:13:35.443 に答える