Como usar o Pattern, Matcher na API Java regex para remover uma linha específica

Oct 19 2020

Eu tenho uma divisão de string complicada, preciso remover os comentários , espaços e manter todos os números, mas transformar todas as strings em caracteres . Se o -sinal estiver no início e for seguido por um número, trate-o como um número negativo em vez de um operador

o comentário tem o estilo de ?<space>comments<space>?(os comentários são um marcador de posição)

Entrada :

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

resultado :

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

(toda a string em caracteres e sem espaço, sem comentários)

Respostas

2 ArvindKumarAvinash Oct 19 2020 at 05:41
  1. Substitua a corda indesejada \s*\?\s*\w+\s*(?=\?)por "". Você pode acorrentar String#replaceAllpara remover qualquer espaço em branco restante. Observe que ?=significa lookahead positivo e aqui significa \s*\?\s*\w+\s*seguido por um ?. Espero que você já saiba que \sespecifica espaços em branco e \wespecifica um caractere de palavra.
  2. Em seguida, você pode usar o regex, o ^-\d+|\d+|\Dque significa um inteiro negativo no início (ou seja ^-\d+) ou dígitos (ou seja \d+) ou um não-dígito ( \D).

Demo:

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());
        }
    }
}

Resultado:

-122
+
2
?
s
a
b