문자열에서 숫자(정수 및 유리수) 정규식 표현
숫자로 이루어진 문자열를 숫자형으로 표현할 때 난감한 경우들이 있다.
"0123", "123.1230", "0123.1230", "0.001230"...
위와 같은 문자열들을 정확한 정수 혹은 유리수인지 검출하는 정규식을 작성할 것이다.
1. 정수 검출
2. 유리수 검출
와 같이 나누어서 하나 하나 살펴보고
최종 목표로 정규식 하나로 전부 검출해보자.
RegExr: Learn, Build, & Test RegEx
RegExr is an online tool to learn, build, & test Regular Expressions (RegEx / RegExp).
regexr.com
테스트는 위 사이트에서 해볼 수 있다.
Expression 에 정규식을 넣고
Text 에 검출하려는 문자를 넣으면 된다.
정규식에 검출되면 파란색으로 드래그처리 된다.
1. 정수 검출
^[^0]\d*
위 정규식의 의미를 살펴보자
^ : 문자열의 맨 처음 문자가
[^0] : 숫자 0이 아니고
-------------------------------------
\d : 0부터 9까지 숫자이고
* : 개수가 여러개 일때
-------------------------------------
-> 맨 처음 문자열이 0이 아닌 여러개의 숫자로 이루어진 문자열 검출
검출 예)
1234 : true
0123 : false
2. 유리수 검출 1
^[^0]\d*\.{1}\d*[^0]$
위 정규식의 의미를 살펴보자
^ : 문자열의 맨 처음 문자가
[^0] : 숫자 0이 아니고
-------------------------------------
\d : 0부터 9까지 숫자이고
* : 개수가 여러개 이고 다음에
-------------------------------------
\.{1} : 반드시 . 이 한개 있어야 하고
-------------------------------------
\d : 0부터 9까지 숫자이고
* : 개수가 여러개 이고
-------------------------------------
[^0]$ : 마지막으로 0 으로 끝나지 않는 문자를 찾아라
-> 정수 부분이 0으로 시작하지 않는 숫자이고, 소수 부분이 0으로 끝나지 않는 숫자로 이루어진 문자열 검출
검출 예)
문자열 | 결과 |
0123.123 | false |
123.1230 | false |
0123.1230 | false |
123 | false |
0.123 | false |
.123 | false |
123.123 | true |
2. 유리수 검출 2
^(0.)\d*[^0]$
위 정규식의 의미를 살펴보자
^ : 문자열의 맨 처음 문자가
(0.) : ()안의 0. 문자 조합으로 시작되어야 하고
-------------------------------------
\d : 0부터 9까지 숫자이고
* : 개수가 여러개 이고 다음에
-------------------------------------
[^0]$ : 마지막으로 0 으로 끝나지 않는 문자를 찾아라
-------------------------------------
-> 0. 으로 시작하고 0으로 끝나지 않는 유리수를 찾아라
문자열 | 결과 |
12.123 | false |
12 | false |
123.120 | false |
0.120 | false |
0.123 | true |
유리수 1과 2를 나눈 이유는 한번에 검출하기 어려워서 나누었다...
위 정규식을 한번에 합치면 정수, 유리수 모두 검출 할 수 있다.
방법은 다음과 같다.
^[^0]\d*|^[^0]\d*\.{1}\d*[^0]$|^(0.)\d*[^0]$
위 3개의 정규식을 | 으로 이어 붙이면 된다.
정규식1 | 정규식2 | 정규식3
a | b 의 의미는 a 이거나 b이면 true이다.
다만 위 정규식을 테스트 사이트에서 하면 제대로 검출이 되지 않는데,
자바 코드에서 테스트 해본결과 잘 검출 되었다.
아래 테스트 코드를 공유한다
3 java 예제
String regex = "^[^0]\\d*|^[^0]\\d*\\.{1}\\d*[^0]$|^(0.)\\d*[^0]$";
String textData = "123.123";
if(textData.matches(regex)){
System.out.println("올바른 양식");
}else{
System.out.println("숫자 형식 오류");
}