Java 匹配器甚至不匹配循环中的 find()
Java matcher not matching even conditioned to find() in a loop
简介
我想在 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:NetBeans
- Java版本是1.8.0_221
问题出在 while
循环中的这一行:
System.out.println(matcher.matches());
这里 matches()
尝试将整个区域与模式匹配。
如果匹配成功,则可以通过start
、end
和group
方法获取更多信息。
由于您的正则表达式与整个输入不匹配,matches()
returns false
您将得到 java.lang.IllegalStateException
代码调用 .group(1)
.
要修复,只需注释掉 System.out.println(matcher.matches());
行并重新运行代码。
顺便说一下,您可以使用这个更短的正则表达式:
final Pattern pattern = Pattern.compile("\(([^)]+)\)");
因为不需要在字符 class 内转义 )
并且 DOTALL
在这里是多余的,因为您没有在正则表达式中的任何地方使用 DOT。
简介
我想在 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:NetBeans
- Java版本是1.8.0_221
问题出在 while
循环中的这一行:
System.out.println(matcher.matches());
这里 matches()
尝试将整个区域与模式匹配。
如果匹配成功,则可以通过start
、end
和group
方法获取更多信息。
由于您的正则表达式与整个输入不匹配,matches()
returns false
您将得到 java.lang.IllegalStateException
代码调用 .group(1)
.
要修复,只需注释掉 System.out.println(matcher.matches());
行并重新运行代码。
顺便说一下,您可以使用这个更短的正则表达式:
final Pattern pattern = Pattern.compile("\(([^)]+)\)");
因为不需要在字符 class 内转义 )
并且 DOTALL
在这里是多余的,因为您没有在正则表达式中的任何地方使用 DOT。