2017-04-08 1 views
-3

스캐너를 사용하여 간단한 CLI 도구에서 입력의 유효성을 검사하려고합니다. 문자열에는 문자, 숫자 및 슬래시 만 포함 할 수 있습니다.java scanner.hasnext 정규식이 예상대로 작동하지 않습니다.

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: 

편집 : 위의 코드 내 프로그램의 출력이

여기
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(); 

} 

} 

입니다 : 내가 여기

http://www.freeformatter.com/java-regex-tester.html에서 테스트 할 때 나는 ^[a-zA-Z0-9/]+$ 작품을 사용한 정규식 내 코드입니다 /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 '의 시작을 의미한다고 생각합니다. 그러나 입력이 시작될 때를 제외하고는 일치가 일어나지 않으므로 사용자는 입력 권한을 얻는 두 번째 기회를 얻지 못합니다. 당신은 우리가 그것을 제거 할 필요가 있다는 점에서 정확했습니다. –

+0

정규 표현식에 나타나는 위치에서 의미를 얻습니다. –

관련 문제