3

文字列があるとします:

「私のイベントは 1976 年にニューヨークのブロードウェイで起こった」

そのような文字列はたくさんありますが、場所と日付は異なります。例えば:

「私の出来事は 1998 年にボストンの 2 番街で起こった」 「私の出来事は 1968 年にウォシュテノーのアナーバーで起こった」

したがって、一般的な形式は次のとおりです。「私のイベントは X で Y で Z で発生しました」

文字列を解析して X、Y、Z を抽出したい

Split を使用し、"in"、"on" という標識語を使用して必要なトークンを区切ることもできますが、これは扱いにくいようです。しかし、grammatica のような完全なパーサー/レクサーを使用するのは、かなり重いようです。

推薦はありがたく受け入れます。

C# 用の「単純な」パーサー lexer はありますか?

4

3 に答える 3

4

ここでKISSが適用されます。解決策を実行するか、「in」と「out」を見つけるためにString.Split使用するだけです(率直に言って、これが最も簡単です)。このような単純な「文法」には、これ以上複雑なものは必要ありません。特に、ここでは正規表現が過剰であることに注意してください。String.IndexOfString.Split

于 2011-02-06T14:48:21.010 に答える
0

正規表現パターン マッチングを使用してみてください。これは非常に役立つ MSDN リンクです: http://support.microsoft.com/kb/308252


例が役立つ場合があります。正規表現ソリューションを使用すると、より多くのバリアントが表示されたときに受け入れることができることに注意してください。ちなみに、正規表現がやり過ぎだという考えは否定します。私は専門家ではありませんが、このようなことを行うのはとても簡単なので、なぜもっと頻繁に使用されないのだろうかと思います.

var regEx = new Regex(
        "(?<intro>.+) in (?<city>.+) on (?<locality>.+) in (?<eventDate>.+)"
        );

var match = regEx.Match("My event happens in Baltimore on Main Street in 1876.");

if (!match.Success) return;
foreach (var group in new[] {"intro", "city", "locality", "eventDate"})
{
    Console.WriteLine(group + ":" + match.Groups[group]);
}

最後に、パフォーマンスが本当に心配な場合 (そうでない場合は無視してください)、ここで最適化のヒントを探してください。

于 2011-02-06T14:47:36.123 に答える
0

文字列が常にその形式になると確信している場合は、単語"in" で分割してから"on"で分割することで、既にわかっているようにすることができます。

都市名のデータベースで見つかった単語と検索の有効年を検索したいことを確認してください。


文字列が常にその形式ではない可能性がある場合は、文字列全体で単語を検索し、それらを都市名と年のデータベースと照合して、有効性を確認します。

于 2011-02-06T14:50:47.150 に答える