0

キーと値のペアを持つプロパティ ファイルを解析する必要があり、一部の行がコメント化されている場合があります (! または # 、両方とも有効です)。

エクサ:

key1 val1
Key2 val2
#key3 val3
 # key4 val4
# It does not have = symbol
# Spaces can be any where.
... 

行がコメント化されていない場合は、キーと値をマッチャーのグループ値として読み取ります。次の正規表現とコード スニペットを使用しましたが、期待どおりにキーと値をキャプチャしていません。

    String inputs[] = {
            "key1 val1",
            "Key2 val2",
            "#key3 val3",
            " # key4 val4"              
    };

    Pattern PATTERN = Pattern.compile("^(\\s*[^#!]\\s*)(\\w*)\\s+(\\w*).*$");
    for (int i = 0; i < inputs.length; i++) {

        System.out.println("Input: " + inputs[i]);
        Matcher matcher = PATTERN.matcher(inputs[i]);
        if(matcher.matches()) {
            int groupCount = matcher.groupCount();
            if(groupCount > 0) {
                for (int j = 1; j <= groupCount; j++) {
                    System.out.println(j + " " +  matcher.group(j));
                }
            } else {
                System.out.println(matcher.group());
            }

        } else {
            System.out.println("No match found.");
        }
        System.out.println("");
    }

出力は次のとおりです。

Input: key1 val1
1 k
2 ey1
3 val1

Input: Key2 val2
1 K
2 ey2
3 val2

Input: #key3 val3
No match found.

Input:  # key4 val4
No match found.

私の考えは:

^           - Start of line
(\\s*[^#!]\\s*) - space(s) followed by NO # or ! followed by space(s) 
(\\w*)      - Key
\\s+        - spaces(s)
(\\w*)      - Value
.*          - Anything
$           - End of line

ここで何が間違っているのかを理解するのを手伝ってください。キーの最初の文字をグループとしてキャプチャするのはなぜですか?

4

3 に答える 3

0

解決策を提供するつもりはありませんが、質問に対する回答を提供します。

(\\s*[^#!]\\s*)<-これが最初の文字をキャプチャする理由です。2 つのオプションがあります。

  1. 非キャプチャ グループを使用する(?:Hi, im a non capturing group)( を参照(?: )

    Ps: 非キャプチャ グループを使用すると、正規表現の内部ポインターが増加するため、実際には必要ありません。したがって、2 番目のオプションを使用することをお勧めします。

  2. 後読みを使用して、X の前の文字が#!

3 番目の解決策として、このきれいな例でJava プロパティ ファイルを使用します。

于 2012-12-24T14:49:49.320 に答える
0
Input: key1 val1
1 k
2 ey1
3 val1

これは正規表現に基づいて正しいです。

(\\s*[^#!]\\s*) this is the group1. 

これは、# や ! ではなく、単一の文字に一致することを意味します。文字の前後にスペースがある場合があります。したがって、小道具ファイルの最初の行です。「k」は文字です。

ネガティブルックビハインドをチェックしたいかもしれません。それはゼロ幅アサーションです。

たとえば、次のようになります: (グループ 2 がキーになります)

^\s*(?!<#|!)\s*(\w*).....

それが役に立てば幸い...

于 2012-12-24T14:51:26.280 に答える
0

# や ! がないかチェックする必要はありません。あなたは簡単に行うことができます:/^(?<key>\w+)\s*(?<value>.*)/gm

Javafied 正規表現: ^(?<key>\\w+)\\s*(?<value>.*)(複数行オプションを使用)

デモ+説明: http://regex101.com/r/aM0xK1

于 2012-12-24T14:43:16.087 に答える