using System;
using static System.Console;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Diagnostics;
public class Program {
public static void Main() {
const int times = 1000;
string texto;
var lista = "RUASANTA HELENA, 769 AP 51 BL H JD ALVORADA~ 17513322 ";
var sw = new Stopwatch();
WriteLine($"RegEx: {(Regex.Replace(lista, @"(\d+) ", "$1~ "))}");
sw.Start();
for (int i = 0; i < times; i++) texto = Regex.Replace(lista, @"(\d+) ", "$1~ ");
sw.Stop();
var timer1 = sw.ElapsedTicks;
WriteLine($"SB: {(MudaEndereco(lista))}");
sw.Restart();
for (int i = 0; i < times; i++) texto = MudaEndereco(lista);
sw.Stop();
var timer2 = sw.ElapsedTicks;
WriteLine($"SB2: {(MudaEndereco2(lista, (c) => char.IsDigit(c), (c) => char.IsWhiteSpace(c)))}");
sw.Restart();
for (int i = 0; i < times; i++) texto = MudaEndereco2(lista, (c) => char.IsDigit(c), (c) => char.IsWhiteSpace(c));
sw.Stop();
var timer3 = sw.ElapsedTicks;
var factor = Min(timer1, timer2, timer3);
WriteLine($"RegEx: {(double)timer1 / factor, 6:0.000} ({TimeSpan.FromTicks(timer1).ToString((@"ss\:fff"))}) {timer1 / times, 3} Ticks cada");
WriteLine($"SB: {(double)timer2 / factor, 6:0.000} ({TimeSpan.FromTicks(timer2).ToString((@"ss\:fff"))}) {timer2 / times, 3} Ticks cada");
WriteLine($"SB2: {(double)timer3 / factor, 6:0.000} ({TimeSpan.FromTicks(timer3).ToString((@"ss\:fff"))}) {timer3 / times, 3} Ticks cada");
}
public static string MudaEndereco(string texto, char adicao = '~') {
var resultado = new StringBuilder(texto.Length * 2);
var anterior = '\0';
foreach (var caractere in texto) {
if (Char.IsDigit(anterior) && Char.IsWhiteSpace(caractere)) resultado.Append(adicao);
resultado.Append(caractere);
anterior = caractere;
}
return resultado.ToString();
}
public static string MudaEndereco2(string texto, Func<char, bool> sequencia, Func<char, bool> terminador, char adicao = '~') {
var resultado = new StringBuilder(texto.Length * 2);
var anterior = '\0';
foreach (var caractere in texto) {
if (sequencia(anterior) && terminador(caractere)) resultado.Append(adicao);
resultado.Append(caractere);
anterior = caractere;
}
return resultado.ToString();
}
public static T Min<T>(params T[] numbers) => numbers.Min();
}
//https://pt.stackoverflow.com/q/135183/101
dXNpbmcgU3lzdGVtOwp1c2luZyBzdGF0aWMgU3lzdGVtLkNvbnNvbGU7CnVzaW5nIFN5c3RlbS5MaW5xOwp1c2luZyBTeXN0ZW0uVGV4dDsKdXNpbmcgU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zOwp1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7CgpwdWJsaWMgY2xhc3MgUHJvZ3JhbSB7CglwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpIHsKCQljb25zdCBpbnQgdGltZXMgPSAxMDAwOwoJCXN0cmluZyB0ZXh0bzsKCQl2YXIgbGlzdGEgPSAiUlVBU0FOVEEgSEVMRU5BLCA3NjkgIEFQIDUxIEJMIEggSkQgQUxWT1JBREF+IDE3NTEzMzIyICI7CgkJdmFyIHN3ID0gbmV3IFN0b3B3YXRjaCgpOwoJCVdyaXRlTGluZSgkIlJlZ0V4OiB7KFJlZ2V4LlJlcGxhY2UobGlzdGEsIEAiKFxkKykgIiwgIiQxfiAiKSl9Iik7CgkJc3cuU3RhcnQoKTsKCQlmb3IgKGludCBpID0gMDsgaSA8IHRpbWVzOyBpKyspIHRleHRvID0gUmVnZXguUmVwbGFjZShsaXN0YSwgQCIoXGQrKSAiLCAiJDF+ICIpOwoJCXN3LlN0b3AoKTsKCQl2YXIgdGltZXIxID0gc3cuRWxhcHNlZFRpY2tzOwoJCVdyaXRlTGluZSgkIlNCOiAgICB7KE11ZGFFbmRlcmVjbyhsaXN0YSkpfSIpOwoJCXN3LlJlc3RhcnQoKTsKCQlmb3IgKGludCBpID0gMDsgaSA8IHRpbWVzOyBpKyspIHRleHRvID0gTXVkYUVuZGVyZWNvKGxpc3RhKTsKCQlzdy5TdG9wKCk7CgkJdmFyIHRpbWVyMiA9IHN3LkVsYXBzZWRUaWNrczsKCQlXcml0ZUxpbmUoJCJTQjI6ICAgeyhNdWRhRW5kZXJlY28yKGxpc3RhLCAoYykgPT4gY2hhci5Jc0RpZ2l0KGMpLCAoYykgPT4gY2hhci5Jc1doaXRlU3BhY2UoYykpKX0iKTsKCQlzdy5SZXN0YXJ0KCk7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aW1lczsgaSsrKSB0ZXh0byA9IE11ZGFFbmRlcmVjbzIobGlzdGEsIChjKSA9PiBjaGFyLklzRGlnaXQoYyksIChjKSA9PiBjaGFyLklzV2hpdGVTcGFjZShjKSk7CgkJc3cuU3RvcCgpOwoJCXZhciB0aW1lcjMgPSBzdy5FbGFwc2VkVGlja3M7CgkJdmFyIGZhY3RvciA9IE1pbih0aW1lcjEsIHRpbWVyMiwgdGltZXIzKTsKCQlXcml0ZUxpbmUoJCJSZWdFeDogeyhkb3VibGUpdGltZXIxIC8gZmFjdG9yLCA2OjAuMDAwfSAoe1RpbWVTcGFuLkZyb21UaWNrcyh0aW1lcjEpLlRvU3RyaW5nKChAInNzXDpmZmYiKSl9KSB7dGltZXIxIC8gdGltZXMsIDN9IFRpY2tzIGNhZGEiKTsKCQlXcml0ZUxpbmUoJCJTQjogICAgeyhkb3VibGUpdGltZXIyIC8gZmFjdG9yLCA2OjAuMDAwfSAoe1RpbWVTcGFuLkZyb21UaWNrcyh0aW1lcjIpLlRvU3RyaW5nKChAInNzXDpmZmYiKSl9KSB7dGltZXIyIC8gdGltZXMsIDN9IFRpY2tzIGNhZGEiKTsKCQlXcml0ZUxpbmUoJCJTQjI6ICAgeyhkb3VibGUpdGltZXIzIC8gZmFjdG9yLCA2OjAuMDAwfSAoe1RpbWVTcGFuLkZyb21UaWNrcyh0aW1lcjMpLlRvU3RyaW5nKChAInNzXDpmZmYiKSl9KSB7dGltZXIzIC8gdGltZXMsIDN9IFRpY2tzIGNhZGEiKTsKICAgIH0KCXB1YmxpYyBzdGF0aWMgc3RyaW5nIE11ZGFFbmRlcmVjbyhzdHJpbmcgdGV4dG8sIGNoYXIgYWRpY2FvID0gJ34nKSB7CgkJdmFyIHJlc3VsdGFkbyA9IG5ldyBTdHJpbmdCdWlsZGVyKHRleHRvLkxlbmd0aCAqIDIpOwoJCXZhciBhbnRlcmlvciA9ICdcMCc7CgkJZm9yZWFjaCAodmFyIGNhcmFjdGVyZSBpbiB0ZXh0bykgewoJCQlpZiAoQ2hhci5Jc0RpZ2l0KGFudGVyaW9yKSAmJiBDaGFyLklzV2hpdGVTcGFjZShjYXJhY3RlcmUpKSByZXN1bHRhZG8uQXBwZW5kKGFkaWNhbyk7CgkJCXJlc3VsdGFkby5BcHBlbmQoY2FyYWN0ZXJlKTsKCQkJYW50ZXJpb3IgPSBjYXJhY3RlcmU7CgkJfQoJCXJldHVybiByZXN1bHRhZG8uVG9TdHJpbmcoKTsKCX0KCXB1YmxpYyBzdGF0aWMgc3RyaW5nIE11ZGFFbmRlcmVjbzIoc3RyaW5nIHRleHRvLCBGdW5jPGNoYXIsIGJvb2w+IHNlcXVlbmNpYSwgRnVuYzxjaGFyLCBib29sPiB0ZXJtaW5hZG9yLCBjaGFyIGFkaWNhbyA9ICd+JykgewoJCXZhciByZXN1bHRhZG8gPSBuZXcgU3RyaW5nQnVpbGRlcih0ZXh0by5MZW5ndGggKiAyKTsKCQl2YXIgYW50ZXJpb3IgPSAnXDAnOwoJCWZvcmVhY2ggKHZhciBjYXJhY3RlcmUgaW4gdGV4dG8pIHsKCQkJaWYgKHNlcXVlbmNpYShhbnRlcmlvcikgJiYgdGVybWluYWRvcihjYXJhY3RlcmUpKSByZXN1bHRhZG8uQXBwZW5kKGFkaWNhbyk7CgkJCXJlc3VsdGFkby5BcHBlbmQoY2FyYWN0ZXJlKTsKCQkJYW50ZXJpb3IgPSBjYXJhY3RlcmU7CgkJfQoJCXJldHVybiByZXN1bHRhZG8uVG9TdHJpbmcoKTsKCX0KCQoJcHVibGljIHN0YXRpYyBUIE1pbjxUPihwYXJhbXMgVFtdIG51bWJlcnMpID0+IG51bWJlcnMuTWluKCk7Cn0KCi8vaHR0cHM6Ly9wdC5zdGFja292ZXJmbG93LmNvbS9xLzEzNTE4My8xMDE=