我正在使用Netbeans IDE.对于学校项目,我需要阅读.ini文件,并获取一些具体信息.
我没有使用ini4j的原因:
示例ini文件:
[Section]
Object1 5 m
number = 12
Object2 6 m
;Comment followed by white line
number = 1\
4
Run Code Online (Sandbox Code Playgroud)
\ 意味着需要忽略下一个命令或白线所以ini文件的最后一部分实际上意味着: number = 14
我的任务:我需要将具有相应长度(米)和数字的对象名称存储到单个字符串中,如下所示:Object1的长度为1m,数字为12
我的问题:我使用带分隔符的扫描程序//Z将整个文件存储到一个字符串中.这是有效的(如果我打印出它给出上面例子的String).
我试过这段代码:
String file = file.replaceAll("(\\.)(\\\\)(\\n*)(\\.)","");
Run Code Online (Sandbox Code Playgroud)
如果我尝试仅删除换行符:
String file = file.replace("\n","");
System.out.println(file);
Run Code Online (Sandbox Code Playgroud)
我得到一个空输出.
提前致谢 !
你的问题是你需要\在Java字符串和正则表达式中转义,所以你需要转义它们两次。这意味着如果你想去掉空行,你必须这样写:
file = file.replaceAll("\\n+", "\n");
Run Code Online (Sandbox Code Playgroud)
如果您知道行\末尾的 a 后面总是跟着一个空行,那么这意味着它实际上后面跟着 2 个换行符,这将给出以下内容:
file = file.replaceAll("\\\\\\n\\n", "");
Run Code Online (Sandbox Code Playgroud)
或(相同):
file = file.replaceAll("\\\\\\n{2}", "");
Run Code Online (Sandbox Code Playgroud)
\\\\将导致\\正则表达式,因此它匹配\并将\\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)
}
Run Code Online (Sandbox Code Playgroud)
它比逐行阅读更容易,但性能可能会更差。无论如何,通常这不是问题,因为 ini 文件往往很小。