4

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 が一致しません。これはおそらく、これが「after EOL」から始まっていないためです。空の文字列を前に置くと、[section1]一致します。

  2. '\r\ nke1 valSection=value1\r\nkey2=value2\r\n' を返します。はkeyPair「key1」を返します。大丈夫みたいです。ただし、valPair「value1\r\nkey2=value2\r\n」は返されますが、「value1」は返されません。

ここで何が問題なのですか?

4

2 に答える 2

1

DOTALLパターンでドットをまったく使用しないため、フラグは必要ありません。

\nJavaは自分自身を改行として扱うので\r処理されないと思います。あなたのパターン:

^\\[([a-zA-Z_0-9\\s]+)\\]$

真実ではありませんが、挿入されました

^\\[([a-zA-Z_0-9\\s]+)\\]\r$

意思。

MULTILINE も無視して、次のパターンを行区切り記号として使用することをお勧めします。

(^|\r\n)
($|\r\n)
于 2012-08-09T21:50:23.597 に答える
0

最初の正規表現は正常に機能し (ファイルの読み取り方の問題ではありませんか?)、2 つ目の正規表現には "?" が追加されました。しぶしぶ使用するように署名します。

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

    }

}
于 2012-05-11T13:51:04.350 に答える