使用正则表达式和Java提取基于百分比符号的编码字符串

使用正则表达式和Java提取基于百分比符号的编码字符串,java,regex,Java,Regex,我正在尝试检测/匹配以%开头的编码字符 我的正则表达式是[%][2-9 | A-F][0-9A-F]{1,2}+ 在regexr.com上,它工作正常,符合我的需要 我将这些字符串用于测试:caf%C3%A9+100%+noir%C20和测试%C3%A9+%C3%A0+100% 在我的Java代码中,它只返回第一个组 字符串模式=[%][2-9 | A-F][0-9A-F]{1,2}+; Matcher Matcher=Pattern.compilepattern.matcherinput; 如

我正在尝试检测/匹配以%开头的编码字符

我的正则表达式是[%][2-9 | A-F][0-9A-F]{1,2}+

在regexr.com上,它工作正常,符合我的需要

我将这些字符串用于测试:caf%C3%A9+100%+noir%C20和测试%C3%A9+%C3%A0+100%

在我的Java代码中,它只返回第一个组

字符串模式=[%][2-9 | A-F][0-9A-F]{1,2}+; Matcher Matcher=Pattern.compilepattern.matcherinput; 如果匹配器找到{ 对于int i=0;i
对于测试%C3%A9+%C3%A0+100%是%C3%A9,而不是%C3%A9+%C3%A0,您使用的正则表达式过于复杂。此外,您尝试打印所有匹配项的方式也不起作用。试试这个:

字符串输入=caf%C3%A9+100%+noir%C20; 字符串模式=?:%[2-9A-F][0-9A-F]{1,2}+; Matcher Matcher=Pattern.compilepattern.matcherinput; 而matcher.find{ System.out.printlnmatcher.group; } 这张照片是:

%C3%A9
%C20

您使用的正则表达式过于复杂。此外,您尝试打印所有匹配项的方式也不起作用。试试这个:

字符串输入=caf%C3%A9+100%+noir%C20; 字符串模式=?:%[2-9A-F][0-9A-F]{1,2}+; Matcher Matcher=Pattern.compilepattern.matcherinput; 而matcher.find{ System.out.printlnmatcher.group; } 这张照片是:

%C3%A9
%C20

根据@41686d6564注释,解决方案是使用while循环和group0:

字符串模式=[%][2-9A-F][0-9A-F]{1,2}+; Matcher Matcher=Pattern.compilepattern.matcherinput; 而matcher.find{ System.out.printlnmatcher.group0; }
根据@41686d6564注释,解决方案是使用while循环和group0:

字符串模式=[%][2-9A-F][0-9A-F]{1,2}+; Matcher Matcher=Pattern.compilepattern.matcherinput; 而matcher.find{ System.out.printlnmatcher.group0; }
旁注:在字符类中不使用|字符,除非您确实想逐字匹配字符“|”。您实际上可以在没有组的情况下获得匹配?:%[2-9A-F][0-9A-F]{1,2}+我相信您需要将if语句转换为while循环。你不需要真正的for循环。您可以只打印matcher.group0。看见您还可以将捕获组转换为非捕获组:?:[%][2-9A-F][0-9A-F]{1,2}+。@41686d6564感谢它的工作。你是对的,我应该使用while循环:这看起来像是你在试图重新发明。旁注:除非你真的想逐字匹配字符“|”,否则你不能在字符类中使用|字符。你实际上可以在没有组的情况下获得匹配?:%[2-9A-F][0-9A-F]{1,2}+我认为您需要将if语句转换为while循环。你不需要真正的for循环。您可以只打印matcher.group0。看见您还可以将捕获组转换为非捕获组:?:[%][2-9A-F][0-9A-F]{1,2}+。@41686d6564感谢它的工作。你是对的,我应该使用while循环:这看起来很可疑,好像你在试图重新创造。@Thefourthbird你是对的,我错了。所以他们需要重复组。我纠正了它。谢谢@第四只鸟你是对的,我错了。所以他们需要重复组。我纠正了它。谢谢是否有理由将%放入字符类[%]?是否有理由将%放入字符类[%]?