2014-12-16 2 views
2

왜 이것이 실패합니까?문자열에 숫자가 포함되지 않았는지 확인하기 위해 정규식 검사

String n = "h107"; 
if (n.matches("\\D+")) { 
    System.out.println("non digit in it"); 
} 

나는 그 위에 잠을 자고 아직도 얻지 못했다. 는 지금 해결책을 가지고 :

if (n.matches(".*\\D+.*")) { 

하지만 내 (지식 어쩌면 부족)에

첫 번째는 일치해야합니다. 왜냐하면 완전한 String과 일치해야한다면, 줄 시작을 나타내는 '^'문자의 점은 무엇일까?

+0

그것은 그 또 다른 하나의 지체 자바 API ... –

+0

@dystroy 경우"지체 "의 지정하여 답변을하지 어렵다 같이 : 전체 문자열이 숫자로 구성되어 있다면 간단히 true를 돌려 \d+에 정규 표현식을 변경 misnamed "그렇다면 완전히 동의합니다;) 그렇지 않으면 올바르게 사용하면 꽤 좋습니다 – fge

+0

@fge 잘못된 이름이고 약한 디자인 선택입니다. 표준 정규식 규칙을 사용하면 간단한 검사를 위해 자세한 패턴 API를 사용하지 않고 전체 문자열을 일치 시킬지 여부를 결정할 수있었습니다. –

답변

6

다시 발생하는 문제는 .matches()입니다. 이름이 잘못되었습니다. 그것은 정규식 매칭을하지 않습니다. 그리고 문제는 다른 언어들조차도 그 이름을 잘못 이해하고 있다는 것입니다 (파이썬은 그 하나의 예입니다).

전체 입력을과 일치 시키려고 시도하는 것이 문제입니다.

사용하십시오 Pattern하는 Matcher 대신 .find() (.find()가하는 실제 정규 표현식 매칭, 즉 입력 어디서나 일치하는 텍스트를 찾을 수) :

private static final Pattern NONDIGIT = Pattern.compile("\\D"); 

// in code 
if (NONDIGIT.matcher(n).find()) 
    // there is a non digit 

당신은 실제로 사용해야합니다 Pattern; String.matches()은 때마다 패턴을 다시 컴파일합니다. Pattern은 한 번만 컴파일됩니다.

+1

Java는 구문에 따라 훌륭한 언어입니다. 하지만 태양이 만드는 API는 총체적이다. – clankill3r

+0

글쎄, 이봐, 일단 당신이 그것을 걸면, 당신은 단지 그것이 "기발한"방법에 대해 잊지;) 어쨌든, 모든 것들을 고려, 자바의 정규식 엔진은 아주 좋습니다. 그리고 'Pattern'과 'Matcher'의 논리적 분리가 의미가 있습니다. 그러나, 그래, 나는 방법 이름이 더 좋았 으면 좋겠다. 많은 사람들처럼 ... – fge

1

String.matches전체 문자열이 패턴과 일치하면 true를 반환합니다. "

String n = "h107"; 
if (!n.matches("\\d+")) { 
    System.out.println("non digit in it"); 
} 
+0

'Pattern'을 사용하는 것보다 솔루션으로 꽤 비쌉니다. – fge

관련 문제