2017-04-08 25 views
-3

シンプルなCLIツールでスキャナの入力を検証しようとしています。文字列には、文字、数字、およびスラッシュのみを含めることができます。私はここでhttp://www.freeformatter.com/java-regex-tester.htmljava scanner.hasnext正規表現が正常に動作しない

上でそれをテストするとき、私は^[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

はい、それは持っているが動作するはずです.Pattern- – Koekje

+0

良い点@CollinD、私はよく知っているはずです:) – simon

+0

@Koekje私はあなたが言っていることに従わない...あなたは精巧にできますか? – simon

答えて

0

あなたが使用している正規表現は、最初はNOT ^を持っています。そのため、正規表現はパスを拒否しています。次のコードを試してください。 https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html#hasNext-java.util.regex:

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

パターンの最初の文字としての '^'は、 'not'を意味するのではなく、 'lineの始まり'を意味すると思います。しかし、入力の始め以外で一致が起こるのを防ぐので、ユーザーは入力権を得る2度目のチャンスを得ることはありません。あなたはそれを取り除く必要があったという点で正しいものでした。 –

+0

正規表現で表示される位置から意味が得られます。 –

関連する問題