【问题标题】:java StreamTokenizerjava StreamTokenizer
【发布时间】:2012-01-15 21:52:10
【问题描述】:

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

你好\tworld

我想得到

你好\tworld

而不是:

世界你好

。 谢谢

【问题讨论】:

  • 找到“\n”时将“\\n”添加到字符串中

标签: java stringtokenizer


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这对我有用:

    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)));
    

    并通过

    获取新的strval
    MyTokenizer.sval.replace(TAB_REPLACEMENT, '\t')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-16
      • 1970-01-01
      • 2013-10-13
      相关资源
      最近更新 更多