有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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


共 (3) 个答案

  1. # 1 楼答案

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

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

    但我建议使用拆分机制,因为regex中的回溯可能要慢得多


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

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

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

  3. # 3 楼答案

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

    (\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)
    

    第一组应该包含-之前的所有内容,第二组应该包含-之后的所有内容