如何伪装转义字符 - \“在一个字符串中

时间:2014-03-09 09:55:49

标签: java html string escaping

我在使用语法荧光笔时遇到了一些困难,并且 90%已完成。它的作用是从.java文件的来源读取文本,检测关键字评论等,然后写入(彩色)输出一个HTML文件。它的样本输出是:

Working

(我无法上传整个html页面,所以这是截图。)正如(我希望)你可以看到,我的程序似乎与keywordsliterals和{ {1}}(见下文)因此通常可以记录几乎所有程序。但是当我将comments的转义序列(即")存储在\"内时,它似乎会分崩离析。 错误案例如下所示:

Not Working

字符串文字突出显示不会停留在文字的末尾,而是一直持续到它找到另一个提示,如关键字或其他文字。

所以,问题是如何在String内伪装/隐藏/删除此\"

我的程序的String方法是:

stringFilter

修改

回应前几条评论和答案,这就是我的尝试:

来自public String stringFilter(String line) { if (line == null || line.equals("")) { return ""; } StringBuffer buf = new StringBuffer(); if (line.indexOf("\"") <= -1) { return keywordFilter(line); } int start = 0; int startStringIndex = -1; int endStringIndex = -1; int tempIndex; //Keep moving through String characters until we want to stop... while ((tempIndex = line.indexOf("\"")) > -1 && !isInsideString(line, tempIndex)) { //We found the beginning of a string if (startStringIndex == -1) { startStringIndex = 0; buf.append( stringFilter(line.substring(start,tempIndex)) ); buf.append("</font>"); buf.append(literal).append("\""); line = line.substring(tempIndex+1); } //Must be at the end else { startStringIndex = -1; endStringIndex = tempIndex; buf.append(line.substring(0,endStringIndex+1)); buf.append("</font>"); buf.append(normal); line = line.substring(endStringIndex+1); } } buf.append( keywordFilter(line) ); return buf.toString(); } 的摘录,但不起作用:(

htmlFilter(String)

5 个答案:

答案 0 :(得分:1)

检查在tempIndex-1中找到的char是否为\,然后不要将其视为字符串的开头或结尾。

String originalLine=line;
if ((tempIndex = originalLine.indexOf("\"", tempIndex + 1)) > -1) {
            if (tempIndex==0 || originalLine.charAt(tempIndex - 1) != '\\') { 
...

答案 1 :(得分:1)

要遵循的步骤:

  • 首先用一些临时字符串替换所有\“,如

    String tempStr="forward_slash_followed_by_double_quote";
    line = line.replaceAll("\\\\\"", tempStr);
    //line = line.replaceAll("\\\"", tempStr);
    
  • 做你正在做的事
  • 最后用\“

    替换该临时字符串
    line = line.replaceAll(tempStr, "\\\\\"");
    //line = line.replaceAll(tempStr, "\\\"");
    

答案 2 :(得分:1)

找到引用然后试图弄清楚它是否被转义的麻烦在于仅仅查看前一个字符以查看它是否是反斜杠是不够的 - 考虑

String basedir = "C:\\Users\\";

其中\"不是转义引用,但实际上是转义后的反斜杠,后跟未转义的引号。一般来说,前面带有奇数数量反斜杠的引号会被转义,其中一个前面带有偶数数量的反斜杠。

更明智的方法是从左到右一次解析字符串中的一个字符,而不是试图向前跳引用字符。如果您不想学习像JavaCC或antlr这样的正确解析器生成器,那么您可以使用\G锚点使用正则表达式来处理这种情况(强制每个后续匹配从上一个开始时开始)没有间隙) - 如果我们假设str是输入的子字符串,以字符串文字的开头引号后面的字符开头,那么

Pattern p = Pattern.compile("\\G(?:\\\\u[0-9A-Fa-f]{4}|\\\\.|[^\"\\\\])");
StringBuilder buf = new StringBuilder();
Matcher m = p.matcher(str);
while(m.find()) buf.append(m.group());

将保留包含字符串文字内容的buf,但不包括结束引号,并将处理\"\\和unicode转义\uNNNN等转义符

答案 3 :(得分:1)

我的想法是,当遇到反斜杠时,忽略下一个字符。

String str = "blah\"blah\\blah\n";

int index = 0;
while (true) {
    // find the beginning
    while (index < str.length() && str.charAt(index) != '\"')
        index++;
    int beginIndex = index;
    if (index == str.length()) // no string found
        break;
    index++;
    // find the ending
    while (index < str.length()) {
        if (str.charAt(index) == '\\') {
            // escape, ignore the next character
            index += 2;
        } else if (str.charAt(index) == '\"') {
            // end of string found
            System.out.println(beginIndex + " " + index);
            break;
        } else {
            // plain content
            index++;
        }
    }
    if (index >= str.length())
        throw new IllegalArgumentException(
                "String literal is not properly closed by a double-quote");
    index++;
}

答案 4 :(得分:0)

使用双斜杠“\\”“而不是”\“”......也许它有用......