java scanner.hasnext正则表达式没有按预期工作

时间:2017-04-08 19:23:22

标签: java regex

我尝试使用扫描程序在简单的CLI工具上验证输入。该字符串只能包含字母,数字和正斜杠。当我在http://www.freeformatter.com/java-regex-tester.html

上测试时,我使用的正则表达式^[a-zA-Z0-9/]+$有效

这是我的代码:

import java.util.Scanner;

public class Main {

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    String path = "";
    String domain = "";


    System.out.print("domain (eg. example.com):");
    while (!sc.hasNext("(?=^.{1,254}$)(^(?:(?!\\d+\\.)[a-zA-Z0-9_\\-]{1,63}\\.?)+(?:[a-zA-Z]{2,})$)")) {
        System.out.println("invalid domain name.");
        sc.next();
    }
    domain = sc.next();



    System.out.print("path:");
    while (!sc.hasNext("^[a-zA-Z0-9/]+$")) {
        System.out.println("Invalid path. Try again:");
        sc.next();
    }
    path = sc.next();

}

}

以下是我程序的输出:

domain (eg. example.com):si.com
path:/one/two/three
Invalid path. Try again:
/
Invalid path. Try again:
/one/two
Invalid path. Try again:
aaa
Invalid path. Try again:

修改:上述代码不会对/one/two/one/等字符串产生匹配。

我做错了什么? 我的正则表达式是正确的吗? 为什么我链接的测试人员产生不同的结果?

1 个答案:

答案 0 :(得分:0)

您正在使用的正则表达式在开头有一个NOT ^。正因为如此,正则表达式拒绝了这条道路。请尝试以下代码。

Scanner scanner = new Scanner(System.in);

    System.out.print("path:");
    while (!scanner.hasNext("[a-zA-Z0-9/]+")) {
        System.out.println("Invalid path. Try again:");
        scanner.next();
    }
    String path = scanner.next();
    System.out.println("path:"+path);

应该有效