Existe uma maneira de usar uma lista de parâmetros de cadeia com uma expressão regular (com grupos) para a construção de uma nova cadeia?

StackOverflow https://stackoverflow.com/questions/1814036

  •  06-07-2019
  •  | 
  •  

Pergunta

Vamos dizer por exemplo que eu tenho uma expressão regular como esta:

"The quick (red|brown|blue|yellow) fox (jumps|leaps) over the lazy (dog|cat)."

Este regex tem 3 componentes agrupados -. Se for comparado com uma determinada seqüência, a api regex permitiria que você facilmente extrair o valor dentro de cada grupo

Agora vamos dizer que eu tenho 3 strings:

["red", "leaps","cat"]

Se fizermos a suposição de que todos os personagens do regex que não estão dentro de grupos são apenas caracteres de texto literal - existe uma maneira de inserir, em seguida, cada uma dessas cadeias 3 para o grupo correspondente na expressão regular original, resultando numa cadeia de saída que combina a porção não agrupadas da expressão regular? Neste caso, resultando em "Os rápidos saltos raposa vermelha sobre o gato preguiçoso." De preferência, sem a necessidade de ter uma cadeia que já combinava com a regex.

Eu estou procurando fazer isso em Java - Tenho certeza java.util.regex não suporta isso, mas eu pensei que talvez haveria um 3rd party lib lá fora, que poderia permitir que isso seja feito. Alguém pode me dar algumas dicas?

Foi útil?

Solução

Enquanto você pode fazer sem captura de grupos aninhados, você pode simplesmente usar mais regex para recuperar os literais:

String[] strings = new String[] { "red", "leaps", "dog" };
String[] literals = new String("The quick (red|brown|blue|yellow) fox " +
    "(jumps|leaps) over the lazy (dog|cat).").split("(?=[^\\\\])\\(.*?\\)");

StringBuilder sb = new StringBuilder(literals[0]);
for(int i = 0; i < strings.length; i++) {
    sb.append(strings[i]);
    sb.append(literals[i + 1]);
}

// => sb.toString();

Outras dicas

A maioria das implementações de regex permitir que você faça algo como isso em uma pesquisa e substituição:

s/The quick (red|brown|blue|yellow) fox (jumps|leaps) over the lazy (dog|cat)/The quick $1 fox $2 over the lazy $3/
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top