对于像2012ca-e001a083这样的字符串,我想只解析e001a083,我在Java中使用正则表达式,如:(.*-)(.*)
所以我应该能够在group = 2中取出“e001a083” ?这个正则表达式看起来是否正确?
答案 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中的第一个组,你想要的东西),因为它可以在一次扫描中解析正确的字符串。