Tengo una cadena como abajo

A:82% X 18% Y B:100% X C:82% X 18% Y AB:82% X 18% Y

Desea convertir la cadena anterior al formato inferior (formato obligatorio)

#A:82% X,18% Y #B:100% X #C:82% X,18% Y #AB:82% X,18% Y

Soy capaz de lograr esto

#A:82% X 18% Y #B:100% X #C:82% X 18% Y #AB:82% X 18% Y

Usando este código

String inp = "A:82% X 18% Y B:100% X C:82% X 18% Y AB:82% X 18% Y";
String regex = "(\\b[A-Za-z]{1,}\\:\\b)";   
System.out.println(inp.replaceAll(regex, "#$1"));

Pero no puedo encontrar una forma en la que pueda colocar comas de la manera que quiero que se mencione en el formato requerido.

¿Hay alguna forma de poder seleccionar solo palabras, excepto "#word:", "Number%" y "espacios", de modo que en la resultante solo pueda seleccionar Xs e Ys (X e Y es solo un ejemplo, también son posibles otras palabras ) Porque una vez que pueda seleccionar esas palabras, entonces puedo reemplazarlas con "$ 1"

Gracias

3
Squeez 26 feb. 2018 a las 15:53

4 respuestas

La mejor respuesta

EDITAR: actualizado después del comentario regex

(\d+%\s[A-Z]+)\s(?=\d+%\s[A-Z]+)

Coincidirá con el patrón (Número% Palabra) seguido de (Número% Palabra), sin consumir el segundo, ya que es una búsqueda anticipada.

\1,

Código Java:

String inp = "A:82% X 18% Y B:100% X C:82% X 18% Y AB:60% X 20% Y 20% ZZ";
String regex = "(\\b[A-Za-z]{1,}\\:\\b)";
String inp2 = inp.replaceAll(regex, "#$1");
String regex2 = "(\\d+%\\s[A-Z]+)\\s(?=\\d+%\\s[A-Z]+)";
System.out.println(inp2.replaceAll(regex2, "$1,"));

Pruébalo en línea

1
Nahuel Fouilleul 26 feb. 2018 a las 14:47

Suponiendo que siempre haya ingresado en la forma #word:number% label number% label ..., puede intentar la siguiente expresión regular para que coincida con los espacios entre las etiquetas y los números: (?!<:)\s+(?=\d+%)

Breve desglose:

  • (?!<:) es un aspecto negativo, lo que significa que la coincidencia no debe ir precedida de dos puntos
  • \s+ es una secuencia de uno o más espacios con los que desea hacer coincidir
  • (?=\d+%) es una anticipación positiva, lo que significa que la partida debe ser seguida por number%

En su entrada de prueba que coincidiría con el espacio después de cada X.

0
Thomas 26 feb. 2018 a las 13:07
([a-zA-Z]+:)([0-9]{1,3}%) ([a-zA-Z]+)(?: ([0-9]{1,3}%) ([a-zA-Z]+))?

Con sustitución:

#$1 $2 $3, $4 $5

Debería tener una instrucción if para asegurarse de que el grupo de captura 4 haya capturado algo. Si no es así, entonces use la sustitución:

#$1 $2 $3

Vea la Demo

Esta expresión regular debe ser independiente del idioma (no se utilizan caracteres de escape)

0
KyleFairns 26 feb. 2018 a las 13:34

Esto debería darle la parte entre X e Y (si hay una) [^X]*% Y

0
Lance Toth 26 feb. 2018 a las 13:02