화요정규식 – 5주차 : 숫자

화요일의 정규식 5주차 문제는 숫자 형식을 체크하는 것입니다. 체크할 숫자 형식은 두 가지입니다. 하나는 우리가 흔히 아는 표기법으로 세 자리마다 쉼표로 구분하고 소수점 아래는 점(.)으로 구분하는 것입니다. 두 번째 표기법은 첫 번째와 같은 규칙을 따르지만 단 쉼표 대신 공백을, 점 대신 쉼표를 사용합니다. 각각의 경우에 해당하는 정규표현식을 작성한 뒤 OR 연산자로 붙이면 됩니다.

해답 및 풀이

[toggle txt_show=”5주차 풀이 보기” txt_hide=”5주차 풀이 감추기”]해답
정규표현식 : /^\d{1,3}((,\d{3})*(\.\d+)?|( \d{3})*(,\d+)?)$/

풀이
먼저 정수부의 자리수 구분 기호는 3자리마다 추가해주므로 다음과 같이 작성할 수 있습니다.
\d{1,3}(,\d{3})*|\d{1,3}( \d{3})*
공통된 부분을 빼고 나머지를 괄호로 묶으면 다음과 같습니다.
\d{1,3}((,\d{3})*|( \d{3})*)
자리수 구분 기호가 쉼표일 때는 소수부를 뜻하는 기호가 점(.)이고, 공백일 때는 쉼표입니다. 이 규칙을 적용하면 다음과 같이 작성할 수 있습니다.
\d{1,3}((,\d{3})*\.\d+|( \d{3})*\,\d+)
하지만 소수부는 없을 수도 있으므로 소수부를 서브 패턴으로 묶고 ? 수량자를 사용합니다.
\d{1,3}((,\d{3})*(\.\d+)?|( \d{3})*(\,\d+)?)
숫자의 형식이 올바른지 확인하려면 처음부터 끝까지 비교해야하므로, ^와 $ 기호를 각각 정규식의 처음과 끝에 사용하면 다음과 같이 패턴이 완성됩니다.
/^\d{1,3}((,\d{3})*(\.\d+)?|( \d{3})*(,\d+)?)$/
[/toggle]

댓글을 남겨주세요