【发布时间】:2023-03-22 09:41:02
【问题描述】:
我正在使用正则表达式来尝试匹配 INI 文件中的节块。我正在使用Regular Expressions Cookbook 书中给出的配方,但它似乎对我不起作用。
这是我正在使用的代码:
final BufferedReader in = new BufferedReader(
new FileReader(file));
String s;
String s2 = "";
while((s = in.readLine())!= null)
s2 += s + System.getProperty("line.separator");
in.close();
final String regex = "^\\[[^\\]\r\n]+](?:\r?\n(?:[^\r\n].*)?)*";
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
String sectionBlock = null;
final Matcher regexMatcher = pattern.matcher(s2);
if (regexMatcher.find()) {
sectionBlock = regexMatcher.group();
}
这是我的输入文件的内容:
[Section 2]
Key 2.0=Value 2.0
Key 2.2=Value 2.2
Key 2.1=Value 2.1
[Section 1]
Key 1.1=Value 1.1
Key 1.0=Value 1.0
Key 1.2=Value 1.2
[Section 0]
Key 0.1=Value 0.1
Key 0.2=Value 0.2
Key 0.0=Value 0.0
问题是sectionBlock 最终等于文件的全部内容,而不仅仅是第一部分。
(我不知道这是否重要,但我在 Windows 上执行此操作,s2 中的行分隔符等于“\r\n”(至少,IDEA 调试器将它们显示为).)
我在这里做错了什么?
【问题讨论】:
-
我认为问题出在 Pattern.MULTILINE -- 因为你使用的是贪婪的量词,所以正则表达式会尝试尽可能多地匹配,即文件的全部内容
-
如果我不使用 Pattern.MULTILINE,我仍然会得到整个文件。