这个正则表达式是否正确?

时间:2013-03-14 21:20:10

标签: java regex

对于像2012ca-e001a083这样的字符串,我想只解析e001a083,我在Java中使用正则表达式,如:(.*-)(.*)所以我应该能够在group = 2中取出“e001a083” ?这个正则表达式看起来是否正确?

3 个答案:

答案 0 :(得分:1)

你可以在-上分开并获取最后一部分,或选择你的正则表达式的第二组

String data="2012ca-e001a083";
Pattern p=Pattern.compile("(.*-)(.*)");
Matcher m=p.matcher(data);
if (m.find()){
    System.out.println(m.group(2));
}

但我建议使用拆分机制,因为正则表达式中的回溯可能要慢得多。


还有另一种选择。您可以使用look around机制。然后你不需要指出你想要的那个组。

String data="2012ca-e001a083";
Pattern p=Pattern.compile("(?<=-).*");
Matcher m=p.matcher(data);
if (m.find()){
    System.out.println(m.group());
}

答案 1 :(得分:1)

如果您所匹配的格式非常明确,那么尽可能地匹配格式会更安全(通常更有用)......

(\d{4}[a-z]{2})-(([a-z]\d{3}){2})

像这样分解......

(        // start group 1
\d{4}    // four digits
[a-z]{2} // two letters (lowercase)
)        // close group 1
-        // hyphen
(        // start group 2
(        // start group 3 (repeats within group 2)
[a-z]    // letter
\d{3}    // three digits
){2}     // close group 3, matching when it repeats twice
)        // close group 2 (capturing the repeated group 3)

第1组最终应该包含-之前的所有内容以及

之后的所有内容

答案 2 :(得分:0)

虽然RE会起作用并将你想要的子串作为第二组,但你的RE却很差。特别是,如果您不需要它们,您应该避免捕获组,并且您还应该使第一部分能够被扫描一次而不是尝试回溯。 RE [^-]*-([^-]*)更合适(在这种情况下它将是RE中的第一个组,你想要的东西),因为它可以在一次扫描中解析正确的字符串。

相关问题