任何人都可以推荐一种方法来使用C#执行以下字符串操作

时间:2011-02-06 14:45:50

标签: c# string parsing lexer

假设我有一个字符串:

“我的事件发生在1976年纽约百老汇”

我有很多这样的字符串,但地点和日期各不相同。例如:

“我的事件发生在1998年第二街的波士顿” “我的事件发生在1968年在Washtenaw的Ann Arbor”

所以一般形式是: “我的事件发生在Z的Y上的X”

我想解析字符串以提取X,Y和Z

我可以使用Split并使用“in”,“on”中的标记词来界定我想要的标记,但这看起来很笨重。但是使用像grammatica这样的完整解析器/词法分析器似乎是重量级的。

建议将被感激地接受。

C#是否有一个“简单”的解析器词法分析器?

3 个答案:

答案 0 :(得分:4)

KISS适用于此。只需执行String.Split解决方案,或使用String.IndexOf查找“in”和“out”(坦白说,String.Split是最简单的)。对于这么简单的“语法”,你不需要更复杂的东西;特别要注意的是正则表达式在这里过度。

答案 1 :(得分:0)

尝试使用正则表达式模式匹配。这是一个非常有用的MSDN链接: http://support.microsoft.com/kb/308252


一个例子可能有所帮助。请注意,正则表达式解决方案为您提供了在您看到它们时接受更多变体的范围。顺便说一句,我拒绝接受RegEx过度杀伤的想法。我不是专家,但这样做很容易,我很想知道为什么不经常使用它。

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]);
}

最后,如果性能真的令人担忧(如果不是,请忽略它),请查看here以获取优化提示。

答案 2 :(得分:0)

如果您确定该字符串始终采用该格式,那么您可以通过按“in”然后按“分词来解决问题。 “即可。

为确保您希望在数据库的城市名称和年份中搜索搜索有效期中的搜索字词。

<小时/> 如果字符串可能不是那种格式,那么你可以做的是搜索单词的整个字符串,并将它们与城市名称和年份的数据库进行匹配,并检查它们的有效性。