Computer >> 컴퓨터 >  >> 프로그램 작성 >> JavaScript

JavaScript의 정규식 일치

<시간/>

입력 문자열 str과 패턴 p가 주어지면 에 대한 지원과 함께 정규식 일치를 구현해야 합니다. 및 *.

이 기호의 기능은 다음과 같아야 합니다. -

  • . --> 모든 단일 문자와 일치합니다.

  • * --> 0개 이상의 선행 요소와 일치합니다.

일치는 전체 입력 문자열을 포함해야 합니다(일부 아님).

참고

  • str은 비어 있을 수 있으며 소문자 a-z만 포함할 수 있습니다.

  • p는 비어 있을 수 있으며 소문자-z 및 다음과 같은 문자만 포함합니다. 또는 *.

예:

입력이 -

인 경우
const str = 'aa';
const p = 'a';

그러면 전체 문자열 aa와 일치하지 않기 때문에 출력은 거짓이어야 합니다.

예시

다음은 코드입니다 -

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'));

출력

다음은 콘솔의 출력입니다 -

true