[javascript] 문자열 찾기 총정리
문자열을 찾는 방법은 원하는 찾은 문자열에 대한 결과값이 무엇이냐에 따라 몇가지 다른 메서드를 사용합니다.
찾은 문자열의 시작 위치 얻기
정수 숫자를 반환합니다.
찾는 문자열이 없을 경우 -1을 반환합니다.
indexOf(), lastIndexOf() 2개의 메서드로 문자열 검색을 할 수 있습니다.
indexOf()는 앞에서부터, lastIndexOf()는 뒤에서부터 검색을 합니다.
두개로 나누어진 이유는 문자열이 아주 길고, 찾는 문자열이 검색 문자열 뒤쪽에 있다고 판단될 경우 뒤쪽에서부터 찾을 필요가 생기기 때문입니다.
찾는 문자(열)이 있을 경우 진행 방향으로 처음 나오는 위치의 인덱스를 반환합니다.
const str1 = 'good morning, good afternoon, good evening, and good night';
console.log(str1.indexOf('even')); // 35를 반환
//문자열 뒤에서부터 'good' 이 처음 나오는 시작 위치를 반환함.
console.log(str1.lastIndexOf('good')); //48을 반환
console.log(str1.lastIndexOf('dawn')); // -1을 반환함
찾는 문자열 존재 여부를 판단한 경우
str1.indexOf('찾는문자열') == -1, str1.indexOf('찾는문자열') < 0, str1.includes('찾는문자열') == -1 세가지 방법 모두 유효합니다.
indexOf(), lastIndexOf() 메서드는 배열에 대해서도 동일한 기능을 합니다. 나중에 배열에서 다시 배우게 됩니다.
indexOf(), lastIndexOf() 는 2번째 인자를 가질 수 있습니다.
인자가 없으면 문자열 처음부터 찾으며, 인자가 있을 경우 문자열의 해당 인덱스 위치부터 찾기를 합니다.
//첫번째 'good' 과 두번째 'good' 을 건너뛰고 3번째 'good'의 시작 인덱스를 반환합니다.
console.log(str1.indexOf('good', 15)); // 30을 반환합니다.
특정 위치의 문자 1개를 얻기
해당 위치의 문자 1개를 반환합니다.
위치 지정이 잘못된 경우 빈 문자열을 반환합니다.
문자열에서 문자를 순회(하나씩 모두 확인)해서 원하는 조건을 찾거나 변경할 필요가 있는 경우 사용합니다.
const str1 = 'good morning, good afternoon, good evening, and good night';
console.log(str1.charAt(30)); // 'g'를 반환
console.log(str1.charAt(100)); //'' 를 반환. 인덱스 위치가 음수이거나, 문자열 길이를 초과하는 경우 빈 문자열을 반환함.
특정 문자열이 포함되었는지를 알기
특정 문자열이 포함되었는지 여부만을 판단합니다.
포함되었을 경우 true, 없을 경우 false를 반환합니다.
시작 위치를 얻어 추가적인 조작이나, 문자열을 자를 경우 indexOf()를 사용해야 합니다.
const str1 = 'good morning, good afternoon, good evening, and good night';
console.log(str1.includes('even')); // true 를 반환
console.log(str1.includes('dawn')); // false 를 반환
대소문자 구분없는 문자열 위치 찾기
영문 대소문자 구분없이 문자열을 찾으려면 대소문자 변환 후 찾기를 하거나 정규식을 사용해야 합니다.
indexOf()는 정규식을 지원하지 않으므로 search() 메서드를 사용해야 합니다.
indexOf() 메서드를 사용하는 경우
str1.toLowerCase().indexOf('찾는문자열');
str1.toUpperCase().indexOf('찾는문자열');
과 같이 메서드 체인으로 처리를 할 수 있습니다.
toLowerCase() 는 문자열의 영문 대문자를 모두 소문자로, toUpperCase()는 문자열의 소문자 알파벳을 모두 대문자로 바꿔줍니다.
대문자, 또는 소문자로 변환된 문자열에서 찾기를 하기 때문에 '찾는문자열' 을 사용할 때 주의해야 합니다.
search()를 사용할 경우 찾는 조건에 따라 정규식의 복잡도가 달라집니다.
복잡한 패턴을 사용하지 않는 경우 다음과 같은 간단한 정규식으로 문자열 전체에서 대소문자 구분없이 찾기를 할 수 있습니다.
str1.search(/good/i);
는 'good' 문자열을 대소문자 구분없이 찾아서 첫번째 인덱스를 반환합니다.
'/찾는문자열/i' 와 같이 간단한 단어는 정규식으로 대소문자 구분 없는 찾기를 할 수 있습니다.
뒤에 붙은 i는 대소문자를 무시한다는 정규식 명령 키워드입니다. i를 빼면 대소문자를 구분해 찾게 됩니다.
const str1 = 'good morning, good afternoon, GOOD EVENING, AND GOOD NIGHT';
console.log(str1.toLowerCase().indexOf('good')); // 0을 반환
console.log(str1.toUpperCase().indexOf('GOOD')); // 0을 반환
console.log(str1.search('GOOD')); // 31을 반환
console.log(str1.search(/GOOD/i)); // 0을 반환
정규표현식(Regular Expression)과 일치하는 모든 문자열을 찾기
정규식과 일치하는 모든 문자열을 찾아 반환합니다.
반환 문자열이 없을 경우 널(null) 이 반환됩니다. 따라서 match() 결과는 널 여부를 먼저 체크한 후 결과 값에 대한 처리를 해야 합니다.
정규식과 일치하는 모든 문자열을 찾는 메서드는 match() 입니다.
파라메터는 1개만 받으며, 정규식과 데이터를 사용할 수 있습니다.
const str1 = "bad MORNING, GOOD AFTERNOON, good evening, and good night";
// 'good' 뒤에 공백 1개가 있고 그 뒤에 단어1개가 있는 패턴인 것을 모두 찾음
console.log(str1.match(/good\s\w+/gi)); // ["GOOD AFTERNOON", "good evening", "good night"] 을 반환
// 'bad' 뒤에 공백 1개가 있고 그 뒤에 단어 1개가 있는 패턴인 것을 모두 찾음.
console.log(str1.match(/bad\s\w+/gi));
// 'none' 뒤에 공백 1개가 있고 그 뒤에 단어 1개가 있는 패턴인 것을 모두 찾음.
console.log(str1.match(/none\s\w+/gi)); // null 리턴
// 'good' 문자열인 것 1개를 찾음.
console.log(str1.match('good')); // ["good"]
정규표현식이 아닌 데이터를 사용하는 경우 매치되는 1개의 결과만을 길이 1인 배열로 반환하기 때문에 사용에 큰 의미가 없습니다.