Я так не думаю:
а)
0x00000000004005ef <+50>: mov rax,QWORD PTR [rbp-0x10] ; move the 8bytes starting at the address
; [rbp-0x10] to rax
0x00000000004005f3 <+54>: add rax,0x8 ; rax = rax + 0x08
0x00000000004005f7 <+58>: mov rax,QWORD PTR [rax] ; move the 8bytes starting at the address
; [rax] to rax
б)
0x00000000004005ef <+50>: mov rax,QWORD PTR [rbp-0x8] ; move the 8bytes starting at the address
; [rbp-0x8] to rax
«а)» выглядит так часть кода, которая загружает адрес, применяет (целочисленное) смещение и разыменовывает адрес. Однако, «b)» , начальный адрес отличается (хотя значение с этого другого адреса не читается, хотя).
Чтобы сделать это в C#, использовать System.Text.RegularExpressions.Regex.Replace()
который берет обратный вызов.
static void Main() {
string s1 = Regex.Replace("abcdefghik", "e",
match => "*I'm a callback*");
string s2 = Regex.Replace("abcdefghik", "c", Callback);
}
static string Callback(Match match) {
return "*and so am i*";
}
Обратите внимание, что у Вас есть доступ к согласованным данным через аргумент (и match.Value
в частности, если Вы не хотите получить доступ к regex группам (.Groups
) и т.д.).
Так же, как пример для создания существующих ответов абсолютно конкретными, и показывающий, как лямбда-выражения могут быть удобными:
using System;
using System.Text.RegularExpressions;
class Test
{
static void Main()
{
var template = "On $today$ you need to do something.";
var regex = new Regex(@"\$today\$");
var text = regex.Replace(template,
match => DateTime.Now.ToString("d"));
Console.WriteLine(text);
}
}
(Ответ Marc появился, в то время как я писал это, но я оставлю на виду его как полный пример, если любой не будет думать, что это просто избыточно. Я рад удалить его, если предложено.)