java - 如何从 Java 中的给定字符串中删除注释?

标签 java string replace comments

如何删除以“//”和/**、*等开头的注释?我在 Stack Overflow 上还没有找到任何对我有很大帮助的解决方案,其中很多都超出了我的理解范围,而我仍然停留在最基本的层面上。

到目前为止我的想法是:

for (int i = 0; i < length; i++) {
  for (j = i; j < length; j++) {
        if (obj.charAt(j) == '/' && obj.charAt(j + 1) == '/')

但我不太确定如何替换这些字符后面的单词。以及如何结束何时用“//”注释停止替换。通过/* 注释,至少在概念上我知道我应该替换所有单词,直到弹出“*/”。不过,我还是不确定如何限制替换。为了替换,我想用空字符串替换第二个“/”之后的 charAt ,直到......在哪里?我不知道在哪里“结束”替换。

我在Stack上看了一些实现,但实在没明白。任何帮助都是值得赞赏的,特别是如果它是基础水平的并且对于不精通编程的人来说是可以理解的!

谢谢。

最佳答案

我用正则表达式做了类似的事情(Java 9+):

// Checks for
// 1) Single char literal '"'
// 2) Single char literal '\"'
// 3) Strings; termination ignores \", \\\", ..., but allows ", \\", \\\\", ...
// 4) Single-line comment // ... to first \n
// 5) Multi-line comments /*[*] ... */
Pattern regex = Pattern.compile(
    "(?s)('\"'|'\\\"'|\".*?(?<!\\\\)(?:\\\\\\\\)*\"|//[^\n]*|/\\*.*?\\*/)");

// Assuming 'text' contains your java text
// Leaves 1,2,3) unchanged and replaces comments 4,5) with ""
// Need quoteReplacement to prevent matcher processing $ and \
String textWithoutComments = regex.matcher(text).replaceAll(
    m -> m.group().charAt(0) == '/' ? "" : Matcher.quoteReplacement(m.group()));

如果您没有 Java 9+,那么您可以使用此替换功能:

String textWithoutComments = replaceAll(regex, text,
    m -> m.group().charAt(0) == '/' ? "" : m.group());
public static String replaceAll(Pattern p, String s,
    Function<MatchResult, String> replacer) {
    Matcher m = p.matcher(s);
    StringBuilder b = new StringBuilder();
    int lastStart = 0;
    while (m.find()) {
        String replacement = replacer.apply(m);
        b.append(s.substring(lastStart, m.start())).append(replacement);
        lastStart = m.end();
    }
    return b.append(s.substring(lastStart)).toString();
}

关于java - 如何从 Java 中的给定字符串中删除注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58511858/

相关文章:

vim - 在 Vim 中,如何搜索和替换所有其他匹配项?

java - 如何使用 geckodriver 检索 Firefox 的崩溃数据(Java 中)

python - 如何使用Python搜索字典值是否包含特定字符串

JAVA替换一个String,无需多次替换

java - 用下一个替换元音不起作用

python - 如何检查一个单词是否适合指定数量的列?

java - ActionBar 后退按钮打开抽屉而不是返回

java - 从远程存储库获取/检查依赖关系

java - 我是否正确实现了基于堆的优先级队列?下堆有必要吗?

java - JAVA中快速简单的字符串加密/解密