Cómo usar Pattern, Matcher en Java regex API para eliminar una línea específica

Oct 19 2020

Tengo una división de cadena complicada, necesito eliminar los comentarios , los espacios y mantener todos los números, pero cambiar todas las cadenas a caracteres . Si el -signo está al principio y seguido de un número, trátelo como un número negativo en lugar de un operador

el comentario tiene el estilo de ?<space>comments<space>?(los comentarios son un marcador de posición)

Entrada:

-122+2 ? comments ?sa b
-122+2 ? blabla ?sa b

salida:

 ["-122","+","2","?","s","a","b"]  

(toda la cadena en carácter y sin espacios, sin comentarios)

Respuestas

2 ArvindKumarAvinash Oct 19 2020 at 05:41
  1. Reemplace la cuerda no deseada \s*\?\s*\w+\s*(?=\?)con "". Puede encadenar String#replaceAllpara eliminar cualquier espacio en blanco restante. Tenga en cuenta que eso ?=significa anticipación positiva y aquí significa \s*\?\s*\w+\s*seguido de un ?. Espero que ya sepas que \sespecifica espacios en blanco y \wespecifica un carácter de palabra.
  2. Luego, puede usar la expresión regular, ^-\d+|\d+|\Dque significa un entero negativo al principio (es decir ^-\d+) o dígitos (es decir \d+) o un número que no sea un dígito ( \D).

Manifestación:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        String str = "-122+2 ? comments ?sa b";
        str = str.replaceAll("\\s*\\?\\s*\\w+\\s*(?=\\?)", "").replaceAll("\\s+", "");

        Pattern pattern = Pattern.compile("^-\\d+|\\d+|\\D");
        Matcher matcher = pattern.matcher(str);
        while (matcher.find()) {
            System.out.println(matcher.group());
        }
    }
}

Salida:

-122
+
2
?
s
a
b