3

假设我有一个字符串:

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

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

“我的事件发生在 1998 年的波士顿第二街” “我的事件发生在 1968 年的沃什特瑙的安娜堡”

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

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

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

我们将不胜感激地接受建议。

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

4

3 回答 3

4

KISS 在这里适用。只需做String.Split解决方案,或使用String.IndexOf找到“in”和“out”(坦率地说,String.Split是最简单的)。对于这样一个简单的“语法”,您不需要任何更复杂的东西;特别注意正则表达式在这里是多余的。

于 2011-02-06T14:48:21.010 回答
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]);
}

最后,如果性能是一个真正令人担忧的问题(如果不是,请忽略这一点),请在此处查找优化提示。

于 2011-02-06T14:47:36.123 回答
0

如果您确定该字符串将始终采用该格式,那么您可以按照您已经想出的方式通过单词"in"然后按"on"进行拆分。

为了确保您想在城市名称和年份数据库中搜索 Found 单词以获取搜索的有效性


如果字符串可能并非始终采用该格式,那么您可以做的是搜索整个字符串以查找单词并将它们与城市名称和年份的数据库进行匹配并检查它们的有效性。

于 2011-02-06T14:50:47.150 回答