有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

regexjava的扫描器。如何匹配空白?

假设,我需要匹配包含空格的括号

以下是一个片段:

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没有

这个问题问得不对。我的目的是用scanner按顺序获取字符串中的所有()标记,因为matcher似乎有不方便的API来完成这类任务。 我应该彻底阅读文档

我需要的方法是:

scanner.findInLine(pattern);

共 (3) 个答案

  1. # 1 楼答案

    当您使用"\\n"作为分隔符(并因此覆盖默认值,即空白)时,整个输入"( ) ( ) ( )"将成为一个标记

    hasNext尝试将complete标记与pattern匹配时,它返回false

    从文档中选择方法^{}

    Returns true if the next complete token matches the specified pattern.

    因此,在您的例子中,方法调用实际上是试图将"( ) ( ) ( )""( )"匹配

  2. # 2 楼答案

    从扫描仪检查javadoc。下一步(模式):

    Returns true if the next complete token matches the specified pattern...

    因此,由于您的模式与整个标记"( ) ( ) ( )"不匹配,它将返回false

    但是Scanner有一个名为findInLine的函数,可以执行您想要的操作:

    scanner.findInLine(pattern); // returns "( )" or null if not found
    

    (但是,此方法可以跳过字符…)

  3. # 3 楼答案

            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
    

    如上所述更新您的代码

    你误解了。必须将Pattern设置为Scanner对象的分隔符