假设我需要匹配包含空格的括号。
这是一个片段:
String input = "( ) ( ) ( )";
Pattern pattern = Pattern.compile("\\(\\s\\)");
Scanner scanner = new Scanner(input);
scanner.useDelimiter("\\n");
Matcher matcher = pattern.matcher(input);
System.out.println(scanner.hasNext(pattern)); // false
System.out.println(matcher.find()); // true
System.out.println(matcher.start(0) + " " + matcher.end(0)); // 0 3
Matcher完全符合我的需要,但Scanner没有。
问题未被正确询问。我的目的是用扫描器顺序抓取字符串中的所有()标记,因为匹配器似乎对此类任务有不方便的API。 我应该彻底阅读文档。
我需要的方法是:
scanner.findInLine(pattern);
答案 0 :(得分:1)
从Scanner.hasNext(Pattern)检查javadoc:
如果下一个完整标记与指定模式匹配,则返回true ...
因此,由于您的模式与整个标记"( ) ( ) ( )"
不匹配,因此它将返回false。
然而Scanner
有一个名为findInLine
的函数,可以执行您想要的操作:
scanner.findInLine(pattern); // returns "( )" or null if not found
(但是,此方法可以跳过字符...)
答案 1 :(得分:1)
当您使用"\\n"
作为分隔符(因此覆盖默认值为空格)时,整个输入"( ) ( ) ( )"
将成为一个标记。
当hasNext
尝试将完整标记与pattern
匹配时,它会返回false
。
从文档方法Scanner.hasNext(Pattern pattern)
如果下一个完整标记与指定模式匹配,则返回true。
因此,在您的情况下,方法调用实际上是尝试将"( ) ( ) ( )"
与"( )"
匹配。
答案 2 :(得分:0)
String input = "( ) ( ) ( )";
Pattern pattern = Pattern.compile("\\(\\s\\)");
Scanner scanner = new Scanner(input);
scanner.useDelimiter(pattern); //**CHANGED**
Matcher matcher = pattern.matcher(input);
System.out.println(scanner.hasNext()); //**CHANGED**
System.out.println(matcher.find());
System.out.println(matcher.start(0) + " " + matcher.end(0)); // 0 3
按上述方式更新您的代码。
你误解了useDelimiter()
。您必须将Pattern
设置为Scanner
对象的分隔符。