我在使用Netbeans IDE。对于一个学校项目,我需要阅读一个..ini文件,并获得一些具体的信息。
我不使用ini4j的原因是:
例ini-file:
[Section]
Object1 5 m
number = 12
Object2 6 m
;Comment followed by white line
number = 1\
4\意味着需要忽略下一个命令或白行,因此ini文件的最后一部分实际上意味着:number = 14
我的任务是:我需要将具有对应长度(米)和数字的弹出名称存储在一个字符串中,如下所示: Object1的长度为1m,数字为12
我的问题是:我使用带有分隔符//Z的扫描器将整个文件存储到一个字符串中。这是可行的(如果我打印出字符串,它给出了上面的示例)。
我试过这段代码:
String file = file.replaceAll("(\\.)(\\\\)(\\n*)(\\.)","");如果我只尝试删除换行符:
String file = file.replace("\n","");
System.out.println(file);我得到一个空输出。
提前谢谢!
发布于 2015-05-02 11:50:36
您的问题是您需要在Java和正则表达式中封装\,所以您需要对它们进行两次转义。这意味着,如果您想去掉空行,就必须这样编写它:
file = file.replaceAll("\\n+", "\n");如果您知道行尾的\总是后面跟着一个空行,那么这意味着它实际上后面是两个新行字符,这将提供以下内容:
file = file.replaceAll("\\\\\\n\\n", "");或者(是一样的):
file = file.replaceAll("\\\\\\n{2}", "");\\\\将导致正则表达式中的\\,因此它匹配\,\\n将成为\n并匹配新的行字符。
正如@Bohemian所提到的,最好修复ini文件。标准使一切变得更容易。如果您坚持使用自己的文件扩展名,因为它实际上是另一种格式。
还可以编写一个直接提取值的正则表达式:
file = file.replaceAll("\\\\\\n\\n", "");
Pattern pattern = Pattern.compile("^ *([a-zA-Z0-9_]+) *= *(.+?) *$");
Matcher matcher = pattern.matcher(file);
while (matcher.find()) {
System.out.println(matcher.group(1)); // left side of = (already trimmed)
System.out.println(matcher.group(2)); // right side of = (already trimmed)
}这比逐个读行容易,但性能可能更差。无论如何,这通常不是一个问题,因为ini文件往往很小。
发布于 2015-05-02 14:08:34
你在正确的道路上。但逻辑是错误的。实际上,逻辑需要\n来识别ini文件中的新值。
我建议您不要将整个文件读入字符串。为什么?您仍将一个接一个地处理文件中的行。现在,您可以逐个读取整个文件,然后拆分成单个字符串进行分析。为什么不用扫描器逐行读取文件并分析这些行呢?
当您使用单个行时,只需跳过空行。它解决了你的问题。
https://stackoverflow.com/questions/30001497
复制相似问题