핵심 메서드 이해하기
String 클래스의 contains() 메서드는 문자열 값을 매개변수로 받아, 현재 문자열 객체 안에 해당 문자열이 포함되어 있는지 검사한 뒤 포함되어 있으면 true를, 그렇지 않으면 false를 반환합니다.
toLowerCase() 메서드는 현재 문자열의 모든 문자를 소문자로 변환한 새로운 문자열을 반환합니다.
대소문자 무시하고 부분 문자열 포함 여부 확인하기
대소문자와 관계없이 문자열에 특정 부분 문자열이 포함되어 있는지 확인하려면 다음 순서로 진행합니다.
- 원본 문자열을 준비합니다.
- 찾고자 하는 부분 문자열을 준비합니다.
- toLowerCase() 메서드를 사용해 원본 문자열을 모두 소문자로 변환합니다.
- 부분 문자열 역시 toLowerCase() 메서드로 소문자로 변환합니다.
- 소문자로 변환된 원본 문자열에 대해 contains() 메서드를 호출하고, 변환된 부분 문자열을 매개변수로 전달합니다.
두 문자열을 모두 소문자로 맞춘 뒤 비교하기 때문에, 원래 문자열에서 대문자와 소문자가 어떻게 섞여 있었는지와 관계없이 일관된 결과를 얻을 수 있습니다.
예제
D 드라이브에 다음과 같은 내용을 담은 sample.txt 파일이 있다고 가정해 보겠습니다.
Tutorials point originated from the idea that there exists a class of readers who respond better to on-line content and prefer to learn new skills at their own pace from the comforts of their drawing rooms. At Tutorials point we provide high quality learning-aids for free of cost.
다음 자바 예제는 사용자로부터 부분 문자열을 입력받아, 해당 파일이 그 부분 문자열을 포함하고 있는지 대소문자 구분 없이 검사합니다.
import java.io.File;
import java.util.Scanner;
public class SubStringExample {
public static String fileToString(String filePath) throws Exception{
String input = null;
Scanner sc = new Scanner(new File(filePath));
StringBuffer sb = new StringBuffer();
while (sc.hasNextLine()) {
input = sc.nextLine();
sb.append(input);
}
return sb.toString();
}
public static void main(String args[]) throws Exception {
Scanner sc = new Scanner(System.in);
System.out.println("검증할 부분 문자열을 입력하세요: ");
String subString = sc.next();
String fileContents = fileToString("D:\\sample.txt");
// 파일 내용을 소문자로 변환
fileContents = fileContents.toLowerCase();
// 부분 문자열을 소문자로 변환
subString = subString.toLowerCase();
// 파일이 해당 부분 문자열을 포함하는지 검사
boolean result = fileContents.contains(subString);
if(result) {
System.out.println("파일에 해당 부분 문자열이 포함되어 있습니다.");
} else {
System.out.println("파일에 해당 부분 문자열이 포함되어 있지 않습니다.");
}
}
}실행 결과
검증할 부분 문자열을 입력하세요: comforts of their drawing rooms. 파일에 해당 부분 문자열이 포함되어 있습니다.
참고: 더 효율적인 대안
새로운 소문자 문자열을 생성하지 않고 비교하고 싶다면 regionMatches() 메서드를 활용할 수 있습니다. 이 메서드는 첫 번째 인수에 true를 전달하면 대소문자를 무시하고 두 문자열의 특정 영역을 비교하므로, 불필요한 문자열 복사가 발생하지 않아 성능 면에서 유리합니다.
boolean result = fileContents.regionMatches(
true, // 대소문자 무시
fileContents.indexOf(subString.charAt(0)), // 시작 위치 탐색
subString,
0,
subString.length());또한 정규식을 선호한다면 Pattern.compile(subString, Pattern.CASE_INSENSITIVE)처럼 CASE_INSENSITIVE 플래그를 사용해 Matcher로 검사하는 방법도 있습니다. 상황에 맞는 방식을 선택하면 됩니다.