I’m trying to search a specific string like 9.7 in an array using regex test method, but, it’s returning values that contains 1984, 1987 in the same row and also 9.7 rows.
searchText= '9.7'; items = [ {description: "MERCEDES BENZ L 1519 - OM 355/5 9.7 L 10V SOHV L5 1973 1987"}, {description: "MERCEDES BENZ LB 2219 - OM 355/5 9.7 L 10V SOHV L5 1973 1980"}, {description: "MERCEDES BENZ LS 1932 - OM 355/6 LA 11.6 L 12V SOHV L6 1984 1987"}, {description: "MERCEDES BENZ O 370 RSD OM 355/5 11.6 L 10V SOHV L5 1985 1987"} ] let returnArray = [], splitText = searchText.toLowerCase().split(/s+/), regexp_and = '(?=.*' + splitText.join(')(?=.*') + ')', re = new RegExp(regexp_and, 'i'); for (let x = 0; x < items.length; x++) { if (re.test(items[x][field])) { returnArray.push(items[x]); } } return returnArray;
Expected output:
array = [ {description: "MERCEDES BENZ L 1519 - OM 355/5 9.7 L 10V SOHV L5 1973 1987"}, {description: "MERCEDES BENZ LB 2219 - OM 355/5 9.7 L 10V SOHV L5 1973 1980"}]
Could anyone help me? Thanks.
Advertisement
Answer
The .
is a special char meaning any character. So when your search string contains it you need to escape it or it will be treated like the wildcard.
use
const splitText = searchText .toLowerCase() .split(/s+/) .map(token=>token.replace(/./g,'\.'));
but keep in mind that this might happen with other special characters
const searchText = '9.7'; const items = [{ description: "MERCEDES BENZ L 1519 - OM 355/5 9.7 L 10V SOHV L5 1973 1987" }, { description: "MERCEDES BENZ LB 2219 - OM 355/5 9.7 L 10V SOHV L5 1973 1980" }, { description: "MERCEDES BENZ LS 1932 - OM 355/6 LA 11.6 L 12V SOHV L6 1984 1987" }, { description: "MERCEDES BENZ O 370 RSD OM 355/5 11.6 L 10V SOHV L5 1985 1987" }]; const returnArray = []; const splitText = searchText .toLowerCase() .split(/s+/) .map(token => token.replace(/./g, '\.')); const regexp_and = '(?=.*' + splitText.join(')(?=.*') + ')'; const re = new RegExp(regexp_and, 'i'); const field = 'description'; for (let x = 0; x < items.length; x++) { if (re.test(items[x][field])) { returnArray.push(items[x]); } } console.log(returnArray);