이 글에서는 Java에서 정규식(Regular Expression)을 활용하여 문자열에서 숫자를 추출하는 다양한 방법을 예제 코드와 함께 소개합니다.
문자열을 파싱하고 필요한 정보를 추출하는 능력은 모든 테스터가 반드시 갖춰야 할 핵심 기술입니다. 특히 API를 테스트할 때 JSON이나 XML 응답을 파싱해야 하는 상황에서 그 유용성이 더욱 돋보입니다.
아래의 Java 정규식 예제들은 문자열에서 숫자나 자릿수를 추출하는 데 초점을 맞추고 있습니다.
문자열에서 모든 숫자 추출하기
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExamples {
public static void main(String[]args) {
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("string1234more567string890");
while(m.find()) {
System.out.println(m.group());
}
}
}실행 결과:
1234
567
890- Java에서 String을 Int로 변환하는 방법
- Java에서 문자열 거꾸로 뒤집는 방법
- Java에서 문자열 비교하는 방법
문자열에서 n번째 숫자 추출하기
문자열에서 특정 숫자만 골라서 추출하고 싶다면 group() 함수에 인덱스를 지정하면 됩니다.
예를 들어, string1234more567string890이라는 문자열에서 두 번째 숫자 그룹인 567만 추출하고 싶다면 다음과 같이 작성할 수 있습니다:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExamples {
private static final Pattern p = Pattern.compile("[^\\d]*[\\d]+[^\\d]+([\\d]+)");
public static void main(String[] args) {
// 패턴 p와 주어진 문자열로 매처 생성
Matcher m = p.matcher("string1234more567string890");
// 주어진 문자열에서 패턴이 발견되었다면...
if (m.find()) {
System.out.println(m.group(1)); // 두 번째 매칭된 숫자
}
}
}실행 결과:
567패턴 [^\d]*[\d]+[^\d]+([\d]+)의 동작 방식을 살펴보면 다음과 같습니다:
- 숫자가 아닌 문자는 모두 무시
- 첫 번째 숫자 그룹은 무시
- 다시 숫자가 아닌 문자는 무시
- 두 번째 숫자를 캡처
태그 속성에서 숫자 추출하기
XML이나 HTML 태그를 다루다 보면 속성(attribute)에서 값을 추출해야 하는 경우가 종종 있습니다. 예를 들어 다음과 같은 태그가 있다고 가정해 보겠습니다.
<result name="response" numFound="9999" start="0">
여기서 9999라는 숫자를 추출하려면 아래 코드를 사용할 수 있습니다:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExamples {
public static void main(String[]args) {
String tag = "<result name=\"response\" numFound=\"9999\" start=\"0\">";
Pattern pattern = Pattern.compile("numFound=\"([0-9]+)\"");
Matcher matcher = pattern.matcher(tag);
if (matcher.find()) {
System.out.println(matcher.group(1));
}
}
}실행 결과:
9999숫자와 문자가 섞여 있는 문자열 추출하기
Java 정규식을 활용하면 숫자와 문자가 함께 포함된 문자열의 일부분도 추출할 수 있습니다. 예를 들어 Sample_data = YOUR SET ADDRESS IS 6B1BC0 TEXT라는 문자열에서 6자리 길이의 6B1BC0을 추출하고 싶다면 다음과 같이 사용할 수 있습니다:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExamples {
public static void main (String[] args) {
Pattern p = Pattern.compile("YOUR SET ADDRESS IS\\s+([A-Z0-9]{6})");
Matcher n = p.matcher("YOUR SET ADDRESS IS 6B1BC0 TEXT");
if (n.find()) {
System.out.println(n.group(1)); // 6B1BC0 출력
}
}
}실행 결과:
6B1BC0정규식으로 키-값 쌍 추출하기
bookname=testing&bookid=123456&bookprice=123.45 형식의 문자열이 있고, 이 중에서 키-값 쌍인 bookid=123456만 추출하고 싶다면 후방탐색(lookbehind)을 활용한 다음 코드를 사용하면 됩니다:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExamples {
public static void main(String[] args) {
String s = "bookname=cooking&bookid=123456&bookprice=123.45";
Pattern p = Pattern.compile("(?<=bookid=)\\d+");
Matcher m = p.matcher(s);
if (m.find()) {
System.out.println(m.group());
}
}
}실행 결과:
123456지금까지 Java 정규식을 활용해 문자열에서 숫자를 추출하는 대표적인 다섯 가지 시나리오를 살펴봤습니다. Pattern과 Matcher 클래스의 기본 사용법만 익혀두면, 단순 숫자 추출부터 태그 속성 파싱, 키-값 쌍 추출까지 다양한 상황에 응용할 수 있습니다. 실제 프로젝트에서 API 응답 검증이나 로그 분석에 적극적으로 활용해 보시기 바랍니다.