2013-10-03 1 views
-1

-214748.00 또는 -214748에서 214748.00까지의 통화 숫자 범위와 일치하는 정규식을 어떻게 작성합니까?Regex 표현식으로 통화 숫자 범위와 일치

시도했지만 작동하지 않았습니다.

^[-]?[0-9]{1,214748 }(?:\\.[0-9]{2})?$ 
+3

숫자가있는 경우 왜 정규식을 사용해야합니까? – drobert

+0

내 요구 사항은 숫자를 제한하는 것입니다. 제한을 초과하면 예외를 throw해야합니다. –

+0

이것은 정규식에 대한 작업이 아닙니다. 드라이버로 손톱을 망치겠습니까? 범위 제한이 10의 제곱 수 (즉, -100000 <= x <= 100000) –

답변

5

노노 노. 작업에 잘못된 도구를 사용하고 있습니다. 정규 표현식은 텍스트 처리 도구 일뿐입니다. 텍스트의 의미를 해석하는 것은 좋지 않습니다. 처리해야 할 텍스트의 의미를 식별 할 때, 정규 표현이 좋지 않은 부분입니다.

이 작업에는 간단한 언어 도구와 연산자를 사용해야합니다. 그 외에도 화폐를 다루는 경우 double 또는 float을 사용하지 마십시오. 그들은 모든 부동 소수점 수를 정확히 표현하기에는 정밀도가 충분하지 않습니다. 대신 BigDecimal을 사용하십시오.


경고 :, 지금까지 이러한 문제에 대해이 작업을 사용하지 마십시오 :
참고 :이 부동 소수점 숫자를 처리하지 않습니다.

당신이 너무 많이 주장하고 있기 때문에 테스트 한 일부 입력에 대해 작동하는 정규식을 따라했습니다. 나는 그것이 주어진 범위 내의 값에 대해서 잘 작동 것 같아요

"-?(\\d{1,5}|1\\d{5}|2(?:0\\d{4}|1(?:[0-3]\\d{3}|4(?:[0-6]\\d{2}|7(?:[0-3]\\d|4[0-8])))))" 

-?가 음수에 대한 - 옵션을 의미합니다.

데모 코드 :

String str = "-?(\\d{1,5}|1\\d{5}|2(?:0\\d{4}|1(?:[0-3]\\d{3}|4(?:[0-6]\\d{2}|7(?:[0-3]\\d|4[0-8])))))"; 

System.out.println("214748".matches(str)); // true 
System.out.println("214746".matches(str)); // true 
System.out.println("2148".matches(str)); // true 
System.out.println("-21448".matches(str)); // true 
System.out.println("-214747".matches(str)); // true 
System.out.println("214749".matches(str)); // false 

정규식은 다음과 같은 사실을 사용합니다.범위 [-214748, 214748] 들어 :

  • 상관 5 이하 자리수는 유효 - 1로 시작 \\d{1,5}
  • 상관 6 자리 숫자가 유효 - 1\\d{5}
  • 2 시작하는 번호는 :
    • 또한 5 0으로 시작하는 숫자는 유효합니다. - 20\\d{4}
    • 2 옆의 숫자가인 경우 [0-3]로 시작개
      1. 더 이상의 4 개 자리 번호는 유효 - 4로 시작하는 더 이상 4 자리 번호를 21[0-3]\\d{3}
      2. : [0-6]로 시작
        • 번호는 유효 - 214[0-6]\d{2}
        • 4 후 자리 인 경우 7,
          1. [0-3]으로 시작하는 그 이상의 번호는 유효합니다. -74입니다
          2. 하면 숫자 후, 다음 4[0-8]가 유효 범위 - 21474[0-8]
  • 여기
+1

@Downvoter 치료 의견. –

+1

@ NullUserException. 나는 해결책을 제시하지 않았다. 방금 regex를 사용해서는 안되는 이유를 추가했습니다. 사용법을 알려 줬습니다. 나는 OP가 최소한이 일을 사업자들에게하기를 기대합니다. –

+1

충분합니다. 그러나 나는 닌자 편집 전에 대답을 downvoted – NullUserException

1

당신이 요구하는지 않는 작업 정규식입니다 :

^-?((([0-9]{1,5}|1[0-9]{5}|2(0[0-9]{4}|1([0-3][0-9]{3}|4([0-6][0-9]{2}|7([0-3][0-9]|4[0-7])))))([.][0-9]{2})?)|214748([.]00)?)$ 

이 0 214747까지의 범위와 일치하는 다음 하위 정규식에 크게 의존 :

([0-9]{1,5}|1[0-9]{5}|2(0[0-9]{4}|1([0-3][0-9]{3}|4([0-6][0-9]{2}|7([0-3][0-9]|4[0-7]))))) 

왜 0에서 214,747에하지 0 214,748에를? 이 방법을 사용하면 214748.01에서 214748.99 (+/-)까지 값을 일치시키는 것을 피하는 것이 더 쉽습니다.

^ # match start of line 
-? # optional minus sign 
    (# match one of the following groups, this one: 
    (
    ([0-9]{1,5}|1[0-9]{5}|2(0[0-9]{4}|1([0-3][0-9]{3}|4([0-6][0-9]{2}|7([0-3][0-9]|4[0-7]))))) 
    # the sub-regex above matches the range from 0 to 214747 
    ([.][0-9]{2})? # this matches the optional two decimals 
    ) 

    | # or this one: 
    214748([.]00)? # 214748, with optional zeroes 
) 
$ # match end of line 

을 그리고 거기 당신은 볼 커녕 유지하는 악몽 지나치게 복잡한 정규식 그것을 가지고 : 정규식을 깨고 우리가 얻을. 범위를 변경해야하는 경우 많은 작업이 필요합니다.

이 괴물이이 작업을 위해 정규 표현식을 사용하지 않기를 바랍니다. 다른 사람들이 말하고 적절한 도구를 사용하여 처리하십시오. 정규식 이 필요한 경우이라고 말하면 끔찍한 생각이며 요구 사항을 수정하도록 요청하십시오.