Wookim

문자열에서 숫자(정수 및 유리수) 정규식 표현 본문

카테고리 없음

문자열에서 숫자(정수 및 유리수) 정규식 표현

개발자인 경우 2021. 8. 26. 19:08

숫자로 이루어진 문자열를 숫자형으로 표현할 때 난감한 경우들이 있다.

 

"0123", "123.1230", "0123.1230", "0.001230"...

 

위와 같은 문자열들을 정확한 정수 혹은 유리수인지 검출하는 정규식을 작성할 것이다.

 

1. 정수 검출

2. 유리수 검출 

 

와 같이 나누어서 하나 하나 살펴보고

 

최종 목표로 정규식 하나로 전부 검출해보자.

 

 

https://regexr.com/

 

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("숫자 형식 오류");
}

 

Comments