2017-04-08 82 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

它從它出現在正則表達式中的位置獲得它的含義.... –

相關問題