如何用Java排除引号内单词的检查?交叉引用开发遇阻
处理Java字符串引号内容的解决方案
嘿,我明白你现在卡在处理引号内单词的问题上了——刚开发这类交叉引用工具的时候,确实容易在字符串解析这种细节上卡壳。针对你遇到的情况,我给你几个实用的思路和代码示例:
核心思路:状态标记法
这是最直观也最容易实现的方式,用布尔变量跟踪当前是否处于引号内部,再配合转义字符的处理,就能精准跳过引号里的内容:
- 定义
inQuotes变量标记是否在双引号字符串内,inEscape标记是否处于转义状态(用来处理\"这种转义引号的情况) - 遍历代码的每个字符时,先处理转义字符:遇到
\就开启转义状态,直接跳过下一个字符 - 遇到双引号
"时,切换inQuotes的状态(进入/退出字符串范围) - 只有当
inQuotes为false时,才执行你已有的关键字、注释排除逻辑,处理有效单词
代码片段示例
把这个逻辑融入到你的现有代码里大概是这样:
public class CrossReference { static Scanner in; static PrintWriter out; static int currentLine = 0; static boolean inQuotes = false; static boolean inEscape = false; public static void main(String[] args) throws IOException { in = new Scanner(new File("YourJavaFile.java")); // 替换成你的输入源 out = new PrintWriter("output.txt"); while (in.hasNextLine()) { currentLine++; String line = in.nextLine(); StringBuilder word = new StringBuilder(); for (char c : line.toCharArray()) { // 处理转义字符,跳过转义后的内容 if (inEscape) { inEscape = false; continue; } if (c == '\\') { inEscape = true; continue; } // 切换引号内状态 if (c == '"') { inQuotes = !inQuotes; continue; } // 只有不在引号内时,才处理你的核心逻辑 if (!inQuotes) { // 这里放你已有的:判断单词边界、排除关键字、处理注释的代码 // 示例:如果是字母数字,添加到word;否则处理当前word if (Character.isLetterOrDigit(c)) { word.append(c); } else { if (word.length() > 0) { String currentWord = word.toString(); // 排除关键字、注释的逻辑... word.setLength(0); } } } } // 处理行尾剩余的单词 if (word.length() > 0 && !inQuotes) { String currentWord = word.toString(); // 排除关键字、注释的逻辑... } } out.close(); in.close(); } }
额外注意点
- 如果需要处理单引号的字符常量(比如
'a'),可以再添加一个inSingleQuotes状态变量,逻辑和双引号类似 - Java里没有原生多行字符串,所以不需要额外处理跨越多行的引号内容(除非是用
+拼接的多行字符串,那其实是多个单行字符串,这个逻辑也能覆盖)
内容的提问来源于stack exchange,提问作者kay
相关产品推荐
相关产品推荐

