Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这个正则表达式正确吗?_Java_Regex - Fatal编程技术网

Java 这个正则表达式正确吗?

Java 这个正则表达式正确吗?,java,regex,Java,Regex,对于像2012ca-e001a083这样的字符串,我只想解析e001a083,并且我正在使用Java中的正则表达式,比如:(.*)(.*),所以我应该能够在group=2中拉出“e001a083”,对吗?这个正则表达式看起来正确吗?您可以在-上进行以太拆分,然后取最后一部分,或者选择第二组正则表达式 String data="2012ca-e001a083"; Pattern p=Pattern.compile("(.*-)(.*)"); Matcher m=p.matcher(data); i

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

您可以在
-
上进行以太拆分,然后取最后一部分,或者选择第二组正则表达式

String data="2012ca-e001a083";
Pattern p=Pattern.compile("(.*-)(.*)");
Matcher m=p.matcher(data);
if (m.find()){
    System.out.println(m.group(2));
}
但我建议使用分割机制,因为regex中的回溯可能要慢得多


还有另一种选择。你可以使用机械装置。然后你就不需要指出你想要哪一组了

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

Pattern p=Pattern.compile((?如果您要匹配的格式定义得非常清楚,那么尽可能紧密地匹配格式会更安全(而且通常更有用)

(\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组应该包含之后的所有内容,虽然这会起作用并交付您想要的子字符串作为第二组,但您的结果很差。特别是,如果您不需要,您应该避免捕获组,并且您还应该使第一部分能够被扫描只需一次,而不是试图回溯。RE
[^-]*-([^-]*)
更合适(在这种情况下,它将是RE中您想要的第一个组),因为它可以在一次扫描中解析正确的字符串。

为什么需要正则表达式?只需在
-
处使用它就可以了?"问题对我来说总是很奇怪。为什么不……试试看呢?我只能使用正则表达式,因为我使用的是一个只支持正则表达式的外部api。那么这应该作为一个答案的约束条件。当我必须测试正则表达式时,它会派上用场。写一个好的RE有一种艺术:你必须像匹配自动机一样思考。这有点难以解释如果您从未完成过CS的必要部分,那么关键是确保代码始终准确地知道它在做什么……您能解释一下这个正则表达式吗?