Извлечь строку между знаком 2 доллара - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть строка, которая содержит переменную.Но мне нужно заменить name на то, что у меня есть в БД.

string text = "hello $$name$$, good morning"

Как мне извлечь name с помощью Regex?

Это работает, только если у меня есть один $

var MathedContent = Regex.Match((string)bodyObject, @"\$.*?\$");

Ответы [ 5 ]

0 голосов
/ 16 февраля 2019
string input = "hello $$name$$, good morning";
Regex rx = new Regex(@"(?<=\$\$)(.*?)(?=\$\$)");

Console.WriteLine(rx.Match(input).Groups[1].Value); 

Результат:

name
0 голосов
/ 14 февраля 2019

Используйте набор отрицаний, [^ ].Например, [^$]+, где мы будем сопоставлять до следующего $.

string text = "hello $$name$$, good morning";

Regex.Replace(text, @"\$\$[^$]+\$\$", "Jabberwocky");

Результат:

 hello Jabberwocky, good morning

Более подробный, но легче читаемый, без экранирования, шаблон [$]{2}[^$]+[$]{2}.

0 голосов
/ 14 февраля 2019

Ваш вопрос немного двусмысленный относительно того, хотите ли вы заменить все $$name$$ или найти строку между долларами.

Вот рабочий код для обоих:

Замените $$ name$$ с Бобом

    string input = "hello $$name$$, good morning";
    var replaced = Regex.Replace(input, @"(\$\$\w+\$\$)", "Bob");
    Console.WriteLine($"replaced: {replaced}");

Печать replaced: hello Bob, good morning

Извлечение имени из строки:

    string input = "hello $$name$$, good morning";
    var match = Regex.Match(input, @"\$\$(\w+)\$\$").Groups[1].ToString();
    Console.WriteLine($"match: {match}");

Печать match: name

0 голосов
/ 14 февраля 2019

Если вы хотите захватить текст между $$ разделителями, но исключить сами $$, вы можете использовать lookaround : (?<=\$\$).*?(?=\$\$)

Lookarounds - утверждения нулевой длины(очень похоже на \b), которые соответствуют символам, но не включают их в результат.(?<=XXX)YYY соответствует YYY при условии, что предшествует XXX.Точно так же, YYY(?=ZZZ) соответствует YYY при условии, что за следует за ZZZ.

var match = Regex.Match("hello $$name$$, good morning", @"(?<=\$\$).*?(?=\$\$)");
Console.WriteLine(match.Value);   // outputs "name"
0 голосов
/ 14 февраля 2019

Вы можете определить регулярное выражение, "(\$\$)(.*?)(\$\$)" с 3 различными группами:

 "(\$\$)(.*?)(\$\$)"
 ^^^^^^|^^^^^|^^^^^^
    $1    $2    $3

, а затем, если вам нужна простая замена, вы можете сделать что-то вроде этого:

string replacedText = Regex
    .Replace("hello $$name$$, good morning", @"(\$\$)(.*?)(\$\$)", "replacement");
//hello replacement, good morning

или объединить с другими группами

string replacedText = Regex
    .Replace("hello $$name$$, good morning", @"(\$\$)(.*?)(\$\$)", "$1replacement$3");
//hello $$replacement$$, good morning

С другой стороны, если вам нужно больше контроля, вы можете сделать что-то вроде этого (от tnx до Wiktor ):

IDictionary<string, string> factory = new Dictionary<string, string>
{
    {"name", "replacement"}
};

string replacedText = Regex.Replace(
    "hello $$name$$, good morning",
    @"(?<b>\$\$)(?<replacable>.*?)(?<e>\$\$)",
    m => m.Groups["b"].Value + factory[m.Groups["replacable"].Value] + m.Groups["e"].Value);
//hello $$replacement$$, good morning
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...