为了账号安全,请及时绑定邮箱和手机立即绑定

模式匹配器返回意外值

模式匹配器返回意外值

回首忆惘然 2023-09-13 10:13:54
你能看一下下面结果中的模式(java)吗?我预计结果应该给我 3 个组值,但相反它给了我 2 个值,只是我认为我错过了一些东西。package com.mycompany.testapp;import java.util.regex.Matcher;import java.util.regex.Pattern;/** * * @author bo17a */public class NewClass {    public static void main(String[] args){        Pattern mPattern = Pattern.compile("^love (.*?) way you (.*?)$");        Matcher matcher = mPattern.matcher("love the way you lie");        if(matcher.find()){            String[] match_groups = new String[matcher.groupCount()];            System.out.println(String.format("groupCount: %d", matcher.groupCount()));            for(int j = 0;j<matcher.groupCount();j++){                System.out.println(String.format("j %d",j));                match_groups[j] = matcher.group(j);                System.out.println(match_groups[j]);            }        }    }}我得到的结果是:2love the way you liethe但我的预期结果应该是:3love the way you liethelie更新我尝试按照回复中的建议添加一组号码:/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */package com.mycompany.testapp;import java.util.regex.Matcher;import java.util.regex.Pattern;/** * * @author lee */public class NewClass {    public static void main(String[] args){        Pattern mPattern = Pattern.compile("^love (.*?) way you (.*?)$");        Matcher matcher = mPattern.matcher("love the way you lie");        if(matcher.find()){            String[] match_groups = new String[matcher.groupCount()];                System.out.println(String.format("groupCount: %d", matcher.groupCount()));                for(int j = 0;j<=matcher.groupCount();j++){                    System.out.println(String.format("j %d",j));                    match_groups[j] = matcher.group(j);                    System.out.println(match_groups[j]);                }        }    }}我已经在 Windows 10 JDK 8 Mac OS JDK 8 上尝试过。那么,这可能是 Java 中的一个错误,因为你和我对相同的代码有不同的结果?
查看完整描述

2 回答

?
狐的传说

TA贡献1804条经验 获得超3个赞

我的猜测是,您还希望以团队形式捕捉完整比赛,


^(love (.*?) way you (.*?))$

或者直接在你的计数器上加 1:


测试1

import java.util.regex.Matcher;

import java.util.regex.Pattern;



public class RegularExpression{


    public static void main(String[] args){


        Pattern mPattern = Pattern.compile("^love (.*?) way you (.*?)$");

        Matcher matcher = mPattern.matcher("love the way you lie");

        if(matcher.find()){

            String[] match_groups = new String[matcher.groupCount() + 1];

                System.out.println(String.format("groupCount: %d", matcher.groupCount() + 1));

                for(int j = 0;j<matcher.groupCount() + 1;j++){

                    System.out.println(String.format("j %d",j));

                    match_groups[j] = matcher.group(j);

                    System.out.println(match_groups[j]);

                }

        }


    }

}

输出

groupCount: 3

j 0

love the way you lie

j 1

the

j 2

lie

测试2

import java.util.regex.Matcher;

import java.util.regex.Pattern;



public class RegularExpression{


    public static void main(String[] args){


        final String regex = "^(love (.*?) way you (.*?))$";

        final String string = "love the way you lie";


        final Pattern pattern = Pattern.compile(regex, Pattern.DOTALL);

        final Matcher matcher = pattern.matcher(string);


        while (matcher.find()) {

            System.out.println("Full match: " + matcher.group(0));

            for (int i = 1; i <= matcher.groupCount(); i++) {

                System.out.println("Group " + i + ": " + matcher.group(i));

            }

        }


    }

}

输出

Full match: love the way you lie

Group 1: love the way you lie

Group 2: the

Group 3: lie

正则表达式电路

jex.im可视化正则表达式:

https://img1.sycdn.imooc.com//65011b2c0001ec6609950210.jpg


查看完整回答
反对 回复 2023-09-13
?
九州编程

TA贡献1785条经验 获得超4个赞

显然,matcher.groupCount()在您的情况下返回 2,因此您只需构造两个字符串的数组并将数字小于 2 的组复制到其中,即组 0(整个字符串)和组 1(“the”)。如果您matcher.groupCount()在整个代码中添加 1,它将按预期工作。



查看完整回答
反对 回复 2023-09-13
  • 2 回答
  • 0 关注
  • 86 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信