Может кто-нибудь порекомендовать метод для выполнения следующей строковой операции с использованием C # - PullRequest
3 голосов
/ 06 февраля 2011

Предположим, у меня есть строка:

"мое событие произошло в Нью-Йорке на Бродвее в 1976 году"

У меня много таких строк, но места и даты меняются.Например:

«мое событие произошло в Бостоне на 2-й улице в 1998 году», «мое событие произошло в Энн-Арборе в Вашингтоне в 1968 году»

, поэтому в общем виде: «мое событие произошло вX на Y в Z "

Я хотел бы проанализировать строку для извлечения X, Y и Z

Я мог бы использовать Split и использовать часовые слова" in "," on "для разделениязнак, который я хочу, но это кажется неуклюжим.Но использование полного синтаксического анализатора / лексера, такого как grammatica, кажется тяжеловесным.

Рекомендации будут с благодарностью приняты.

Существует ли "простой" синтаксический анализатор для C #?

Ответы [ 3 ]

4 голосов
/ 06 февраля 2011

KISS применяется здесь. Просто сделайте решение String.Split или используйте String.IndexOf, чтобы найти "вход" и "выход" (честно говоря, String.Split является самым простым) Вам не нужно ничего более сложного для такой простой «грамматики»; обратите внимание, в частности, что регулярное выражение здесь избыточно.

0 голосов
/ 06 февраля 2011

Если вы уверены, что строка всегда будет в этом формате, то вы можете сделать, как вы уже выяснили, разделив слова "в" , а затем "вкл".

Чтобы быть уверенным, что вы хотите выполнить поиск найденных слов в базе данных названий городов и год для срок действия поиска .Если строка может быть не в этом формате всегда, тогда вы можете выполнить поиск всей строки для слов и сопоставить их с базой данных названий городов и годов и проверить их на действительность.

0 голосов
/ 06 февраля 2011

Попробуйте использовать сопоставление с регулярным выражением. Вот ссылка на 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]);
}

Наконец, если производительность действительно беспокоит (хотя игнорируйте это, если это не так), посмотрите здесь для подсказок по оптимизации.

...