0

我正在使用该方法quoteChar('"')来处理字符串。在解析字符串时,常见的转义序列(例如“\n”和“\t”)会被识别并转换为单个字符。有什么方法可以按原样获取字符串,这意味着如果我有字符串:

你好\t世界

我想得到

你好\t世界

并不是:

你好世界

. 谢谢

4

2 回答 2

1

查看StreamTokenizer源代码,看起来字符串的转义行为是硬编码的。我只能想到几种方法来解决它:

  1. 取回字符串后重新转义。这里的问题是这与文件中的内容不完全匹配 - \t 将被转换回,但 \040 不会。
  2. Reader源代码ReaderStreamTokenizer. 将为最后一个标记读取的所有字符存储在缓冲区中。从该缓冲区的开头修剪空白以获得“原始”令牌。
  3. 如果您的分词规则足够简单,请实现您自己的分词器。
于 2012-01-16T00:40:13.447 回答
1

那对我有用:

public class MyReader extends BufferedReader {
    // You can choose whatever replacement you'd like(one wont occur in your text)
    private static final char TAB_REPLACEMENT = '\u0000';

    public MyReader(Reader in) {
        super(in);
    }

    @Override
    public int read() throws IOException {
        int charVal = super.read();
        if (charVal == '\t') {
            return TAB_REPLACEMENT;
        }
        return charVal;
    }
}

然后通过以下方式创建标记器:

myTokenizer = new StreamTokenizer(new MyReader(new FileReader(file)));

并通过

MyTokenizer.sval.replace(TAB_REPLACEMENT, '\t')
于 2015-06-12T09:50:35.110 回答