2017-04-08 144 views
-3

我正在尝试使用扫描程序来验证简单CLI工具上的输入。该字符串只能包含字母,数字和正斜杠。我已经使用^[a-zA-Z0-9/]+$作品,当我测试它http://www.freeformatter.com/java-regex-tester.htmljava scanner.hasnext正则表达式不按预期方式工作

这里的正则表达式是我的代码:

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

是的,它具有:https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html#hasNext-java.util.regex .Pattern- – Koekje

+0

好点@CollinD,我应该知道更好:) – simon

+0

@Koekje我不遵循你所说的话......你能详细说明一下吗? – simon

回答

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); 

它应该工作

+0

谢谢,正是我想念的。 – simon

+0

我认为'^'作为模式的第一个字符并不意味着'不',而是'行的开始'。但是,除了输入开始之外,它确实会阻止匹配的发生,所以用户永远不会再有机会获得正确的输入。你是正确的,我们需要删除它。 –

+0

它从它出现在正则表达式中的位置获得它的含义.... –

相关问题