Como substituir a lista de strings no texto por itens de outra lista?

Daniel

Suponha que eu tenha uma lista de strings {"menino", "carro", "bola"} e um texto "o menino vendeu seu carro para comprar uma bola".

Dada outra lista de strings {"dog", "bar", "bone"}, meu objetivo é encontrar todas as ocorrências da primeira lista dentro do texto e trocá-las pelas strings da segunda lista:

BEFORE: the [boy] sold his [car] to buy a [ball]
AFTER:  the [dog] sold his [bar] to buy a [bone]

Meu primeiro pensamento foi usar Regex, mas não tenho ideia de como associar uma lista de strings a um regex e não quero escrever Aho-Corasick.

Qual é o caminho certo para fazer isso?


Outro exemplo:

Text: aaa bbb abab aabb bbaa ubab
replacing {aa, bb, ab, ub} for {11, 22, 35, &x}

BEFORE: [aa]a [bb]b [ab][ab] [aa][bb] [bb][aa] [ub][ab]
AFTER:  [11]a [22]b [35][35] [11][22] [22][11] [&x][35]
41686d6564

Se quiser usar regex, você pode usar algo assim:

var findList = new List<string>() { "boy", "car", "ball" };
var replaceList = new List<string>() { "dog", "bar", "bone" };

// Create a dictionary from the lists or have a dictionary from the beginning.
var dictKeywords = findList.Select((s, i) => new { s, i })
                           .ToDictionary(x => x.s, x => replaceList[x.i]);

string input = "the boy sold his car to buy a ball";
// Construct the regex pattern by joining the dictionary keys with an 'OR' operator.
string pattern = string.Join("|", dictKeywords.Keys.Select(s => Regex.Escape(s)));

string output =
    Regex.Replace(input, pattern, delegate (Match m)
    {
        string replacement;
        if (dictKeywords.TryGetValue(m.Value, out replacement)) return replacement;
        return m.Value;
    });

Console.WriteLine(output);

Resultado:

o cachorro vendeu seu bar para comprar um osso

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

TOP lista

quentelabel

Arquivo