c # Заменить текст в фигурных скобках, включая фигурные скобки - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь заменить строку, заключенную в фигурные скобки.

Если я использую метод Replace, предоставляемый классом Regex, и не указываю фигурные скобки, строка будет найдена и замененаправильно, но если я укажу фигурные скобки следующим образом: {{FullName}}, текст останется нетронутым.

   var pattern = "{{" + keyValue.Key + "}}";
   docText = new Regex(pattern, RegexOptions.IgnoreCase).Replace(docText, keyValue.Value);

Взять эту строку в качестве примера

Dear {{FullName}}

Я хочу заменить его на John, чтобы текст заканчивался следующим образом:

Dear John.

Как я могу выразить регулярное выражение, чтобы строканайти и заменить правильно?

Ответы [ 5 ]

0 голосов
/ 16 февраля 2019
var keyValue = new KeyValuePair<string,string>("FullName", "John");
var pattern = "{{" + keyValue.Key + "}}";
Console.WriteLine(new Regex(Regex.Escape(pattern), RegexOptions.IgnoreCase).Replace("Dear {{FullName}}", keyValue.Value));

Выход:

Dear John
0 голосов
/ 15 февраля 2019

Я считаю, что вы действительно хотите заменить несколько элементов в документе.

Для этого используйте предоставленный мной шаблон регулярного выражения, но также используйте делегат оценщика соответствия замены регулярного выражения.Это означает, что каждое совпадение может быть активно оценено для каждого элемента, и соответствующий элемент будет заменен согласно логике C #.

Вот пример с двумя возможными настройками ключевых слов.

string text = "Dear {{FullName}}, I {{UserName}} am writing to say what a great answer!";

string pattern = @"\{\{(?<Keyword>[^}]+)\}\}";

var replacements 
   = new Dictionary<string, string>() { { "FullName", "OmegaMan" }, { "UserName", "eddy" } };

Regex.Replace(text, pattern, mt =>
{

    return replacements.ContainsKey(mt.Groups["Keyword"].Value)
           ? replacements[mt.Groups["Keyword"].Value]
           : "???";

}
);

Результат

Уважаемый OmegaMan, я пишу вихрь, чтобы сказатькакой отличный ответ!


В предыдущем примере используется

  • Делегат оценщика совпадений
  • Именованные группы захвата совпадений (?<{Name here}> …)
  • Set Negation [^ ], в котором указано совпадение, пока не будет найден отрицательный элемент, в данном случае закрывающее вьющееся }.
0 голосов
/ 30 января 2019

Вам не нужно регулярное выражение, если ключ является просто строкой.Просто замените "{{FullName}}" на "Джон".пример:

string template = "Dear {{FullName}}";
string result = template.Replace("{{" + keyValue.Key + "}}", keyValue.Value);

Редактировать: решение проблем, которые не работают ...

Ниже приведен полный пример.Вы можете запустить его на https://dotnetfiddle.net/wnIkvf

using System;
using System.Text.RegularExpressions;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        var keyValue = new KeyValuePair<string,string>("FullName", "John");
        string docText = "Dear {{FullName}}";
        string result = docText.Replace("{{" + keyValue.Key + "}}", keyValue.Value);
        Console.WriteLine(result);
    }
}
0 голосов
/ 30 января 2019

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

var keyValue = new KeyValuePair<string,string>("FullName", "John");
string docText = "Dear {{FullName}}";
var pattern = "{{" + keyValue.Key + "}}";
docText = new Regex(Regex.Escape(pattern), RegexOptions.IgnoreCase).Replace(docText, keyValue.Value);

docText будет Dear John

0 голосов
/ 30 января 2019

Ищете "Dear {{FullName}}" до "Dear John"?

не решение регулярных выражений ... но именно так я иногда и предпочитаю.

string s = "Dear {{FullName}}";
// use regex to replace FullName like you mentioned before, then...
s.Replace("{",string.empty);
s.Replace("}",string.empty);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...