我尝试使用Windows下的java解析windows ini文件。假设内容是:
[section1]
key1=value1
key2=value2
[section2]
key1=value1
key2=value2
[section3]
key1=value1
key2=value2
我使用下面的代码:
Pattern pattSections = Pattern.compile("^\\[([a-zA-Z_0-9\\s]+)\\]$([^\\[]*)", Pattern.DOTALL + Pattern.MULTILINE);
Pattern pattPairs = Pattern.compile("^([a-zA-Z_0-9]+)\\s*=\\s*([^$]*)$", Pattern.DOTALL + Pattern.MULTILINE);
// parse sections
Matcher matchSections = pattSections.matcher(content);
while (matchSections.find()) {
String keySection = matchSections.group(1);
String valSection = matchSections.group(2);
// parse section content
Matcher matchPairs = pattPairs.matcher(valSection);
while (matchPairs.find()) {
String keyPair = matchPairs.group(1);
String valPair = matchPairs.group(2);
}
}
但它无法正常工作:
section1不匹配。这可能是因为这不是从“EOL之后”开始的。当我将空字符串放在[section1]
之前然后匹配。
valSection
返回'\ r \ n nke1 = value1 \ r \ n \ nnick2 = value2 \ r \ n'。 keyPair
返回'key1'。看起来好像。但是valPair
会根据需要返回'value1 \ r \ n \ nnick2 = value2 \ r \ n'而不是'value1'。
这里有什么问题?
答案 0 :(得分:1)
您不需要DOTALL
标记,因为您的模式中根本不使用点。
我认为Java将\n
本身视为换行符,因此\r
将不会被处理。你的模式:
^\\[([a-zA-Z_0-9\\s]+)\\]$
不会是真的,但是没有了
^\\[([a-zA-Z_0-9\\s]+)\\]\r$
意愿。
我建议您也忽略MULTILINE并使用以下模式作为行分隔符:
(^|\r\n)
($|\r\n)
答案 1 :(得分:0)
第一个正则表达式是否正常工作(这不是你如何读取文件的问题?),第二个正则表达了“?”签字以不情愿的方式使用它。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main(String[] args) {
String content = "[section1]\r\n" +
"key1=value1\r\n" +
"key2=value2\r\n" +
"[section2]\r\n" +
"key1=value1\r\n" +
"key2=value2\r\n" +
"[section3]\r\n" +
"key1=value1\r\n" +
"key2=value2\r\n";
Pattern pattSections = Pattern.compile(
"^\\[([a-zA-Z_0-9\\s]+)\\]$([^\\[]*)", Pattern.DOTALL
+ Pattern.MULTILINE);
Pattern pattPairs = Pattern.compile(
"^([a-zA-Z_0-9]+)\\s*=\\s*([^$]*?)$", Pattern.DOTALL
+ Pattern.MULTILINE);
// parse sections
Matcher matchSections = pattSections.matcher(content);
while (matchSections.find()) {
String keySection = matchSections.group(1);
String valSection = matchSections.group(2);
// parse section content
Matcher matchPairs = pattPairs.matcher(valSection);
while (matchPairs.find()) {
String keyPair = matchPairs.group(1);
String valPair = matchPairs.group(2);
}
}
}
}