Java 8 编程:读取 .ini 文件并尝试去除换行符
Java 8 programming: Reading a .ini-file and trying to get rid of newline-characters
我正在使用 Netbeans IDE。对于学校项目,我需要阅读 .ini 文件,并获取一些特定信息。
我不使用 ini4j 的原因:
- 我有一个部分具有相同的键值
- 我的某些部分没有我必须从中读取信息的键值输入
示例 ini 文件:
[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);
我得到一个空输出。
提前致谢!
你的问题是你需要在正则表达式中转义\
in Java 字符串和,所以你需要转义它们两次。这意味着如果你想摆脱空行,你必须这样写:
file = file.replaceAll("\n+", "\n");
如果您知道行尾的 \
后面总是跟一个空行,那么这意味着它实际上后面跟着 2 个换行符,它们将给出以下内容:
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 文件往往很小。
你走对了。但是逻辑错了地方。您实际上需要 \n 让您的逻辑识别 ini 文件中的新值。
我建议您不要将整个文件读入字符串。为什么?您仍将逐行处理文件中的行。现在您将整个文件读取为字符串,然后拆分为单个字符串进行分析。为什么不直接使用扫描仪逐行读取文件并在这些行出现时对其进行分析?
当您使用单独的行时,只需跳过空行即可。它解决了您的问题。
我正在使用 Netbeans IDE。对于学校项目,我需要阅读 .ini 文件,并获取一些特定信息。
我不使用 ini4j 的原因:
- 我有一个部分具有相同的键值
- 我的某些部分没有我必须从中读取信息的键值输入
示例 ini 文件:
[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);
我得到一个空输出。
提前致谢!
你的问题是你需要在正则表达式中转义\
in Java 字符串和,所以你需要转义它们两次。这意味着如果你想摆脱空行,你必须这样写:
file = file.replaceAll("\n+", "\n");
如果您知道行尾的 \
后面总是跟一个空行,那么这意味着它实际上后面跟着 2 个换行符,它们将给出以下内容:
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 文件往往很小。
你走对了。但是逻辑错了地方。您实际上需要 \n 让您的逻辑识别 ini 文件中的新值。
我建议您不要将整个文件读入字符串。为什么?您仍将逐行处理文件中的行。现在您将整个文件读取为字符串,然后拆分为单个字符串进行分析。为什么不直接使用扫描仪逐行读取文件并在这些行出现时对其进行分析?
当您使用单独的行时,只需跳过空行即可。它解决了您的问题。