如何删除字符串中以/ *和* /表示的注释?

时间:2019-02-08 05:56:00

标签: java

我的任务是创建一个方法来删除/ *和* /之间的文本。此方法必须删除字符串中的所有注释。

示例: "The quick brown /\* and red\*/ fox jumped over the lazy dog /\*laying on the porch\*/." 变成 "The quick brown fox jumped over the lazy dog.

通过找到索引“ / *”和“ * /”,并使用这些索引创建一个子字符串并将其删除,我成功地删除了一条注释。我创建了一个循环,用于检查/ *的索引是否不等于1,如果不相等,则删除注释。

但是,在删除一个注释之后,我在删除它后留下了/ *和* /标记,因此我编写的remove方法不起作用,因为它正在删除空的/ ** /中的代码标记,而不继续进行下一个注释。我试图通过使用前面提到的索引创建一个包含整个注释的子字符串来删除注释标记,并创建该字符串其余部分的子字符串,删除第一个字符串中的注释标记,然后合并字符串重新组合成一个整体。

当我运行方法和循环时,它删除了第一个注释及其相应的注释标记,但是却使第二个注释完全不受影响。

public static String removeOneComment(String s)
{
    String start = "/*";
    String end = "*/";
    int i = s.indexOf(start);
    int i1 = s.indexOf(end);
    String s1 = s.substring(i, i1);
    s = s.replaceAll(s1, "");
    String s1s = s.substring(0, i1 + 2);
    String s1s1 = s.substring(i1 + 2);
    s1s = s1s.replaceAll("/\\*", "");
    s1s = s1s.replaceAll("\\*/", "");
    s = s1s + s1s1;
    return s;
}
public static String removeComments(String s)
{
    String start = "/*";
    String end = "*/";
    for (int i = s.indexOf(start); i != -1; i = s.indexOf(start, i + 1));;
    {
        s = removeOneComment(s);
    }
    return s;
}

通过运行此代码,我得到的结果是“快速的棕色狐狸跳过了懒狗/ *躺在门廊上* /。”

原始字符串:"The quick brown /\*and red\*/ fox jumped over the lazy dog /\*laying on the porch\*/." 变成 想要的字符串:"The quick brown fox jumped over the lazy dog.

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

您应该只使用它。

public static String removeComments(String s)
{
    return s.replaceAll("\\/\\* *\\w+ *\\*\\/", "");
}

答案 1 :(得分:0)

如果可以使用,则只需使用following使用简单的String#replaceAll,基本上可以消除两者之间的边界。

(\/asterisk.*?asterisk\/)

如果不能使用正则表达式,只需进行一个简单的循环即可,该循环包含一个if语句和一个确定边界的计数器。最后,使用String#substring删除所有内容(以结尾处的注释开头),以免丢失计数器的完整性。

答案 2 :(得分:0)

有效:) -我正在寻找开头和结尾的注释标签-*/\*,这是使用offset替换的原因 -很明显,它正在使用递归调用

Replace part of a string between indexes in Java [closed]

摘录的一些线索
public static String removeCommentsString(String input) {
    // https://stackoverflow.com/questions/54586730/how-to-remove-comments-denoted-by-and-in-a-string
    if (input.contains("\\*") && input.contains("*/")) {
        int firstOccurenceOpen = input.indexOf("\\*");
        int firstOccurenceTrailing = input.indexOf("*/");

        input = replaceAt(firstOccurenceOpen, firstOccurenceTrailing, input);

        if (input.contains("\\*") && input.contains("*/")) {
            input= removeCommentsString(input);
        } else {
            return input;
        }
    }

    return input;
}

public static String replaceAt(int startIndexIncl, int endIndexIncl, String data) {
    // -2 because space and \, +2 because /\*
    return data.substring(0, startIndexIncl - 2) + data.substring(endIndexIncl + 2, data.length());
}

测试:

input: The quick brown /\* and red\*/ fox jumped over the lazy dog /\*laying on the porch\*/.,
 output: The quick brown fox jumped over the lazy dog.
input: The quick brown /\* and red\*/ fox jumped....,
 output: The quick brown fox jumped....