介绍我想使用 Java 中的 RegEx 提取字符串内的子字符串。为此,让我们使用 Pattern 和 Matcher 类来正确完成它。代码package stringlearning;import java.util.regex.Matcher;import java.util.regex.Pattern;/** * * @author Jonathan */public class StringLearning { //Example String public static String line = "This is the (first|second|third) choice."; public static void main(String[] args) { //String is right, right? System.out.println("Line is: " + line); //How to use RegEx in Java properly Pattern pattern = Pattern.compile("\\(([^\\)]+)\\)", Pattern.DOTALL); Matcher matcher = pattern.matcher(line); //While we find, keep looping while(matcher.find()) { //What we foud out? System.out.println(matcher.matches()); System.out.println(matcher.groupCount()); System.out.println(matcher.group(1)); } }}问题我仍然不明白为什么它找不到任何东西。正则表达式是在RegEx上创建的并且可以正常工作(不要忘记转义符!'/')我想知道我缺少什么,它不匹配笔记IDE:NetBeansJava版本是1.8.0_221
1 回答
慕码人2483693
TA贡献1860条经验 获得超9个赞
问题出在while
循环内的这一行:
System.out.println(matcher.matches());
这里matches()
尝试将整个区域与模式进行匹配。
如果匹配成功,则可以通过start
、end
、 和group
方法获取更多信息。
由于您的正则表达式与整个输入不匹配,因此matches()
返回false
,您将得到java.lang.IllegalStateException
代码调用的位置.group(1)
。
要修复,只需注释掉System.out.println(matcher.matches());
行并重新运行代码。
顺便说一句,你可以使用这个更短的正则表达式:
final Pattern pattern = Pattern.compile("\\(([^)]+)\\)");
因为不需要)
在字符类内部转义,并且DOTALL
这里是多余的,因为您没有在正则表达式中的任何地方使用 DOT。
添加回答
举报
0/150
提交
取消