-4

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

4

3 回答 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 回答