Giả sử chúng ta được cung cấp một chuỗi đầu vào str và một mẫu p, chúng ta bắt buộc phải triển khai đối sánh biểu thức chính quy với hỗ trợ for. và *.
Chức năng của các ký hiệu này phải -
-
. -> Khớp với bất kỳ ký tự đơn nào.
-
* -> Đối sánh không hoặc nhiều hơn các phần tử trước đó.
Sự phù hợp phải bao gồm toàn bộ chuỗi đầu vào (không phải một phần).
Lưu ý
-
str có thể trống và chỉ chứa các chữ cái thường a-z.
-
p có thể để trống và chỉ chứa các chữ cái thường a-z và các ký tự như. hoặc *.
Ví dụ -
Nếu đầu vào là -
const str = 'aa'; const p = 'a';
Khi đó, kết quả đầu ra phải là false vì a không khớp với toàn bộ chuỗi aa.
Ví dụ
Sau đây là mã -
const regexMatching = (str, p) => { const ZERO_OR_MORE_CHARS = '*'; const ANY_CHAR = '.'; const match = Array(str.length + 1).fill(null).map(() => { return Array(p.length + 1).fill(null); }); match[0][0] = true; for (let col = 1; col <= p.length; col += 1) { const patternIndex = col - 1; if (p[patternIndex] === ZERO_OR_MORE_CHARS) { match[0][col] = match[0][col - 2]; } else { match[0][col] = false; } } for (let row = 1; row <= str.length; row += 1) { match[row][0] = false; } for (let row = 1; row <= str.length; row += 1) { for (let col = 1; col <= p.length; col += 1) { const stringIndex = row - 1; const patternIndex = col - 1; if (p[patternIndex] === ZERO_OR_MORE_CHARS) { if (match[row][col - 2] === true) { match[row][col] = true; } else if ( ( p[patternIndex - 1] === str[stringIndex] || p[patternIndex - 1] === ANY_CHAR ) && match[row - 1][col] === true ) { match[row][col] = true; } else { match[row][col] = false; } } else if ( p[patternIndex] === str[stringIndex] || p[patternIndex] === ANY_CHAR ) { match[row][col] = match[row - 1][col - 1]; } else { match[row][col] = false; } } } return match[str.length][p.length]; }; console.log(regexMatching('aab', 'c*a*b'));
Đầu ra
Sau đây là kết quả trên bảng điều khiển -
true