Регулярное выражение заменяет $ (Key) в текстовом файле значением из словаря - PullRequest
1 голос
/ 30 марта 2012

Я хочу сделать что-то вроде этого, у меня есть словарь с ключами и значениями, и текстовый файл, подобный этому:

Hello my name is $(Name) and my favorite movie is $(Movie).

Я хочу прочитать в файле и заменить вхождения $ (...) на основе значений в словаре, поэтому в этом случае в словаре будет ключ для имени и фильма.

Как бы я поступил так?Если бы я проанализировал каждое слово, какое бы регулярное выражение соответствовало $ (AnyWord), или было бы лучше сделать что-то вроде этого:

foreach(var word in file)
{
    if (word.length > 3)
    {
        if (word.substring(0,2)=="$(" && word.substring(word.length-1)==")")
           Lookup word in dictionary 
    }
}

Спасибо

Ответы [ 3 ]

3 голосов
/ 30 марта 2012

Используйте MatchEvaluator для замены:

var replacements = new Dictionary<string,string>();
//populate the dictionary
string file = System.IO.File.ReadAllText("filepath");
file = Regex.Replace(file, @"\$\((?<key>[^)]+)\)", new MatchEvaluator(m => replacements.ContainsKey(m.Groups["key"].Value) ? replacements[m.Groups["key"].Value] : m.Value));

Если есть какие-либо синтаксические ошибки, я прошу прощения. Сейчас я на работе без компилятора C #, поэтому мне придется их исправить, когда я вернусь домой.

1 голос
/ 30 марта 2012

Если ваш файл не слишком большой, то простым решением было бы сделать это наоборот. Переберите все элементы в вашем словаре и замените токены:

foreach(var item in dictionary) {
    var token = string.Format("$({0})", item.Key);

    file = file.Replace(token, item.Value);
}
0 голосов
/ 30 марта 2012

Вы можете использовать это регулярное выражение, чтобы найти такие строки, как $ (слово):

/(\$\(\w*\))/i

Разъяснения:

/                      # regex delimiter
    (                  # matching brackets
        \$             # the $
        \(             # the (
            \w*        # \w = a to z
        \)             # the )
    )                  # close matching brackets
/xi

модификаторы: я = без учета регистра, x = игнорировать пробел в регулярном выражении (чтобы вы могли сделать его читабельным и оставлять комментарии вроде этого)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...