0

次のようなデータがあります (正確には、このデータは Windows レジストリから取得されます)。

some data ... PACKAGE_SIZE    REG_SZ    100000\r\n    PATH    REG_SZ    C:\\Some\\path\r\n    VERSION    REG_SZ    1.0.0\r\n some other data...

そこからパスを抽出する必要があるため、次のような正規表現を使用します。

(?<=(PATH.*?REG_SZ)).+?(?=\\r\\n)

しかし、ルックアラウンドはアトミックであるため、私が理解しているように、機能しません。これまでのところ、次のようなものを使用できます。

(?<=PATH).+?(?=\\r\\n)

キャプチャするもの

    REG_SZ    C:\\Some\\path

私の質問は、一度にパスを抽出することは可能ですか? (正規表現を2つ使わないという意味です)

4

2 に答える 2

1

この方法で試すことができます

String data="some data ... PACKAGE_SIZE    REG_SZ    100000\r\n    PATH    REG_SZ    C:\\Some\\path\r\n    VERSION    REG_SZ    1.0.0\r\n some other data";
Pattern p=Pattern.compile("PATH\\s+REG_SZ\\s+(.*)\\r\\n");
Matcher m=p.matcher(data);
if (m.find())
    System.out.println(m.group(1));

出力:C:\Some\path

于 2012-07-13T09:41:09.603 に答える
0

これを試して

try {
    Pattern regex = Pattern.compile("(?<=PATH\\s{1,10}REG_SZ\\s{1,10})(\\S[^\r\n]+)(?=\r\n)", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
    Matcher regexMatcher = regex.matcher(subjectString);
    while (regexMatcher.find()) {
        // matched text: regexMatcher.group()
        // match start: regexMatcher.start()
        // match end: regexMatcher.end()
    } 
} catch (PatternSyntaxException ex) {
    // Syntax error in the regular expression
}

重要:

PATHと の間のスペースの数は1 ~ 10 の範囲で変化するREG_SZと仮定します。matched data

于 2012-07-13T09:39:17.130 に答える