对于像 2012ca-e001a083 这样的字符串,我只想解析 e001a083,并且我在 Java 中使用正则表达式,例如:(.*-)(.*)
所以我应该能够在 group = 2 中提取“e001a083”,对吗?这个正则表达式看起来正确吗?
问问题
66 次
3 回答
1
您可以以太分裂-
并采取最后一部分,或者选择您的正则表达式的第二组,例如
String data="2012ca-e001a083";
Pattern p=Pattern.compile("(.*-)(.*)");
Matcher m=p.matcher(data);
if (m.find()){
System.out.println(m.group(2));
}
但我建议使用拆分机制,因为正则表达式中的回溯可能会慢得多。
还有另一种选择。您可以使用环视机制。然后你不需要指出你想要哪个组。
String data="2012ca-e001a083";
Pattern p=Pattern.compile("(?<=-).*");
Matcher m=p.matcher(data);
if (m.find()){
System.out.println(m.group());
}
于 2013-03-14T21:26:01.937 回答
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 组应该包含之后的所有内容
于 2013-03-14T21:29:04.943 回答
0
虽然该 RE 可以工作并作为第二组提供您想要的子字符串,但您那里的 RE 很差。特别是,如果不需要它们,则应避免捕获组,并且还应使第一部分能够仅被扫描一次,而不是试图回溯。RE[^-]*-([^-]*)
更合适(在这种情况下,它将是 RE 中您想要的第一个组),因为它可以在一次扫描中解析正确的字符串。
于 2013-03-14T22:01:28.043 回答