我在使用语法荧光笔时遇到了一些困难,并且 90%已完成。它的作用是从.java
文件的来源读取文本,检测关键字,评论等,然后写入(彩色)输出一个HTML
文件。它的样本输出是:
(我无法上传整个html页面,所以这是截图。)正如(我希望)你可以看到,我的程序似乎与keywords
,literals
和{ {1}}(见下文)因此通常可以记录几乎所有程序。但是当我将comments
的转义序列(即"
)存储在\"
内时,它似乎会分崩离析。 错误案例如下所示:
字符串文字突出显示不会停留在文字的末尾,而是一直持续到它找到另一个提示,如关键字或其他文字。
所以,问题是如何在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)
答案 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)
使用双斜杠“\\”“而不是”\“”......也许它有用......