Regex para corresponder a um comentário de múltiplas linhas em estilo C

Eu tenho uma string para por exemplo

String src = "How are things today /* this is comment *\*/ and is your code /*\* this is another comment */ working?" 

Eu quero remover /* this is comment *\*/ e /** this is another comment */ substrings da seqüência src .

Eu tentei usar o regex mas falhei devido a menos experiência.

Tente usar este regex (somente comentários de linha única):

 String src ="How are things today /* this is comment */ and is your code /* this is another comment */ working?"; String result=src.replaceAll("/\\*.*?\\*/","");//single line comments System.out.println(result); 

REGEX explicou:

Corresponder o caractere “/” literalmente

Combine o caractere “*” literalmente

“” Corresponder qualquer caractere único

“*?” Entre zero e tempos ilimitados, o menor número de vezes possível, expandindo conforme necessário (preguiçoso)

Combine o caractere “*” literalmente

Corresponder o caractere “/” literalmente

Alternativamente, aqui está o regex para comentários de uma ou várias linhas adicionando (? S) :

 //note the added \n which wont work with previous regex String src ="How are things today /* this\n is comment */ and is your code /* this is another comment */ working?"; String result=src.replaceAll("(?s)/\\*.*?\\*/",""); System.out.println(result); 

Referência:

O melhor regex de comentário de (?s)/\*.*?\*/ é uma versão desenrolada de (?s)/\*.*?\*/ que se parece com

 String pat = "/\\*+[^*]*\\*+(?:[^/*][^*]*\\*+)*/"; 

Veja a explicação do regex em regex101.com .

Em resumo,

  • /\*+ – corresponde ao início do comentário, /* e qualquer 0 + asteriscos após
  • [^*]*\*+ – corresponde a 0 caracteres diferentes de * seguido por 1+ literal *
  • (?:[^/*][^*]*\*+)* – 0+ sequências de:
    • [^/*][^*]*\*+ – não é um / ou * (emparelhado com [^/*] ) seguido por 0 + caracteres não-asteriscos ( [^*]* ) seguidos de 1+ asteriscos ( \*+ )
  • / – fechamento /

O regex de David precisa de 26 etapas para encontrar a correspondência em minha string de exemplo, e meu regex precisa de apenas 12 etapas . Com enormes inputs, o regex de David provavelmente falhará com um problema de estouro de pilha ou algo similar porque o .*? A correspondência de pontos preguiçosos é ineficiente devido à expansão de padrão lento em cada local que o mecanismo regex é executado, enquanto meu padrão corresponde a trechos lineares de texto de uma só vez.

Tente este:

 (//[^\n]*$|/(?!\\)\*[\s\S]*?\*(?!\\)/) 

Se você quiser excluir as partes enclused em “” então use:

 (\"[^\"]*\"(?!\\))|(//[^\n]*$|/(?!\\)\*[\s\S]*?\*(?!\\)/) 

o primeiro grupo de captura identifica todas as partes “” e o segundo grupo de captura fornece comentários (linha única e linha múltipla)

Copie a expressão regular para regex101 se você quiser explicação

 System.out.println(src.replaceAll("\\/\\*.*?\\*\\/ ?", "")); 

Você tem que usar o quantificador não-ganancioso? para obter o regex funcionando. Eu também adicionei um ‘?’ no final da regex para remover um espaço.

Tente isso que funcionou para mim:

 System.out.println(src.replaceAll("(\/\*.*?\*\/)+",""));