Java构建Tokenizer分词器时matcher.find()仅匹配首个内容报错如何解决
问题原因
你代码里存在4处核心错误,分别是:
- 成员变量定义与赋值逻辑完全错误:你类中只声明了
private String text属性,没有声明input属性,单参数构造器中text.input = text.trim()写法完全不成立,String类不存在input成员,且参数名和成员变量重名导致你根本没有给实例的text属性赋值,后续this.input调用会直接编译报错。 - 正则转义错误:Java字符串中反斜杠需要双重转义,你写的
"\G\w+"编译阶段就会报错,正确写法应为"\\G\\w+"。 \G锚点误用导致只能匹配第一个结果:\G的作用是锚定到上一次匹配结束的位置,你第一次匹配到Hello后,下一个匹配起点是Hello后的空格,\w+无法匹配空格,因此matcher.find()直接返回false,自然无法拿到后续结果。如果只是要匹配所有单词,直接去掉\G锚点即可。- 单参数构造器访问权限问题:你没给单参数
Tokenizer(String text)构造器加public修饰符,跨包调用时会有权限问题。
修正后代码
Tokenizer类
import java.util.regex.Matcher; import java.util.regex.Pattern; public class Tokenizer { private Pattern pattern; private Matcher matcher; // 统一属性名,不要混用text和input private String text; public Tokenizer(String text) { // 用this指代实例属性,避免和参数名重名冲突 this.text = text.trim(); } public Tokenizer(String regex, String text) { this(text); pattern = Pattern.compile(regex); matcher = pattern.matcher(this.text); while(matcher.find()) { String match = matcher.group(); System.out.println(match); } } }
调用代码
public static void main(String[] args) { // 去掉\G锚点,仅保留匹配单词的规则 String regex = "\\w+"; String testString = "Hello my friend."; Tokenizer tokenizer = new Tokenizer(regex, testString); }
运行后即可正常输出所有匹配的单词:
Hello my friend
如果你确实需要保留\G做连续匹配(比如要严格按顺序切分不跳过任何非法字符),可以把正则修改为"\\G\\W*(\\w+)",匹配时取group(1)即可拿到所有单词。
内容的提问来源于stack exchange,提问作者bitcasual
相关产品推荐
相关产品推荐

