java中的正则表达式:匹配BOL和EOL

时间:2012-05-11 13:08:35

标签: java regex

我尝试使用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);
    }
}

但它无法正常工作:

  1. section1不匹配。这可能是因为这不是从“EOL之后”开始的。当我将空字符串放在[section1]之前然后匹配。

  2. valSection返回'\ r \ n nke1 = value1 \ r \ n \ nnick2 = value2 \ r \ n'。 keyPair返回'key1'。看起来好像。但是valPair会根据需要返回'value1 \ r \ n \ nnick2 = value2 \ r \ n'而不是'value1'。

  3. 这里有什么问题?

2 个答案:

答案 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);
            }
        }

    }

}