Lookahead与子正则表达式

时间:2012-07-13 09:31:07

标签: java regex regex-lookarounds

我有一些数据(确切地说,这些数据来自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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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之间的空格数,REG_SZmatched data之间的距离可以从1-10变化。