我试图创建一个Matcher实例来从字符串中提取标记。这是我用过的:
Matcher base = Pattern.compile("red|green|blue|\\+|\\(|\\)").matcher(input.trim());
while (!base.hitEnd()) {
if (base.find()) {
String s = base.group();
output += String.format(" %s", s);
}
else {
throw new IllegalArgumentException("Invalid tokens in the input! " + base.toString());
}
}
在这种情况下,input
是要标记化的输入字符串。但是,即使我给它输入"red"
,它仍会抛出异常,并显示该对象没有尝试匹配(没有更改正在考虑的索引,没有先前的匹配)。
我的目标是将确切的单词"red", "green", "blue"
,加号和开始和结束的parens作为标记进行匹配。我错过了什么?
答案 0 :(得分:1)
如果我理解正确,那么当您找不到任何令牌时,您希望抛出异常。如果输入字符串不包含任何标记,那么对您所拥有的内容的这种修改将正确地找到您正在寻找的标记并抛出异常。
Matcher base = Pattern.compile("\\bred\\b|\\bgreen\\b|\\bblue\\b|[+()]{1}").matcher(input.trim());
while (!base.hitEnd()) {
if (base.find()) {
String s = base.group();
System.out.println("Found: " + s);
output += String.format(" %s", s);
}
}
if (output.isEmpty()) {
throw new IllegalArgumentException("Invalid input no matching tokens found! " + base.toString());
}
我在你的正则表达式中更新了一些内容。我为\\b
周围的字边界添加了red, green, blue
,并将+()
合并到一个字符组中。字符组将与[]
中的任何字符中的1个完全匹配。