我正在编写一个简单的解析器来将包含name=value
对中的条目的java属性文件转换为json
字符串。
下面是代码。该代码要求每个条目都在一个新行中:
sCurrentLine = br.readLine();
while ((sCurrentLine) != null)
{
config+=sCurrentLine.replace('=', ':');
sCurrentLine = br.readLine()
if(sCurrentLine!=null)
config+=",";
}
config+="}";
除了属性文件中有额外的空新行外,该函数工作正常。 (例如:假设我在props文件中写入最后一个条目,然后点击两个输入,该文件将在最后一个条目后包含两个空的新行)。虽然预期输出为{name1:value1,name2:value2}
,但在上述情况下,当存在额外的新行时,我将输出作为{name1:value1,name2:value2,}
。尾随,
的数量随着新的空行数增加。
我知道它,因为readLine()
读取空行,而逻辑上它不应该,但我该如何更改?
答案 0 :(得分:2)
这可以使用contains()
方法解决。只需确保您的行中存在"="
..
while ((sCurrentLine) != null)
{
if(sCurrentLine.contains("=") {
config+=sCurrentLine.replace('=', ':');
sCurrentLine = br.readLine()
if(sCurrentLine!=null)
config+=",";
}
}
示例强>
sCurrentLine = "name=dave"
if(sCurrentLine.contains("=")) // Evaluates to true.
// Do logic.
sCurrentLine = ""
if(sCurrentLine.contains("=")) // Evaluates to false.
// Don't do logic.
sCurrentLine = "\n"
if(sCurrentLine.contains("=")) // Evaluates to false.
// Don't do logic.
我知道它,因为readLine()读取空行,而逻辑上它不应该,但我该如何更改?
readLine()
会将所有内容读取到\n
。这是如何检查新线路的。您之前没有\n
,也没有任何内容,因此您的行将由""
组成,因为省略了\n
。
轻微增强
如果你想确保你的行肯定有一个名字和一个属性,那么你可以使用一些简单的正则表达式。
if(s.CurrentLine.matches("\\w+=\\w+"))
// Evaluates to any letter, 1 or moe times, followd by an "=", followed by letters.
答案 1 :(得分:1)
一种方法是使用方法trim()
检查当前行是否为空:
sCurrentLine = br.readLine();
while ((sCurrentLine) != null)
{
If ("".equals(sCurrentLine.trim()) == false)
{
config+=sCurrentLine.replace('=', ':');
sCurrentLine = br.readLine()
if(sCurrentLine!=null)
config+=",";
}
}
config+="}";
答案 2 :(得分:1)
以下代码将检查regex是否为空行。这也应该
if (sCurrentLine != null){
if (!sCurrentLine.matches("^\\s*$")) // matches empty lines
config += ",";
}