Main Content

패턴 표현식 작성하기

R2020b 이상

패턴은 텍스트를 검색하고 수정하는 데 도움이 되는 도구입니다. 정규 표현식과 유사하게 패턴은 텍스트에서 일치하는 부분을 찾기 위한 규칙을 정의합니다. 패턴을 contains, matches, extract와 같은 텍스트 검색 함수와 함께 사용하여 텍스트의 어느 부분에 이러한 함수가 작업을 수행할지 지정할 수 있습니다. 패턴 표현식은 패턴 함수, 연산자 및 리터럴 텍스트를 사용하여 수학 표현식과 유사한 방식으로 작성할 수 있습니다. 패턴 표현식을 작성하는 데는 제약이 없기 때문에 패턴이 상당히 복잡해질 수 있습니다. 패턴을 단계별로 작성하고 maskedPatternnamedPattern 같은 함수를 사용하면 복잡한 패턴을 구조화하는 데 도움이 됩니다.

간단한 패턴 작성하기

가장 간단한 패턴은 단일 패턴 함수로 작성됩니다. 예를 들어, lettersPattern은 영문자와 일치합니다. 다양한 유형의 문자와 텍스트의 다른 특징과 일치시키기 위한 많은 패턴 함수가 있습니다. 이러한 함수 목록은 pattern 도움말 페이지에서 찾을 수 있습니다.

txt = "abc123def";
pat = lettersPattern;
extract(txt,pat)
ans = 2x1 string
    "abc"
    "def"

패턴은 plus(+) 연산자를 사용하여 다른 패턴 및 리터럴 텍스트와 결합합니다. 이 연산자는 패턴 표현식에 정의된 순으로 패턴과 텍스트를 결합합니다. 결합된 패턴은 오직 동일한 순서의 텍스트와 일치합니다. 이 예제에서는 4개 문자로 된 문자열이 텍스트 끝에 있어야 하기 때문에 "YYYY/MM/DD"는 일치 항목이 아닙니다.

txt = "Dates can be expressed as MM/DD/YYYY, DD/MM/YYYY, or YYYY/MM/DD";
pat = lettersPattern(2) + "/" + lettersPattern(2) + "/" + lettersPattern(4);
extract(txt,pat)
ans = 2x1 string
    "MM/DD/YYYY"
    "DD/MM/YYYY"

or(|) 연산자와 함께 사용된 패턴은 지정된 두 패턴 중 하나만 텍스트 섹션과 일치하면 됨을 명시합니다. 두 패턴 중 어느 것도 일치시킬 수 없다면 패턴 표현식은 일치하지 않는 것입니다.

txt = "123abc";
pat = lettersPattern|digitsPattern;
extract(txt,pat)
ans = 2x1 string
    "123"
    "abc"

일부 패턴 함수는 패턴을 입력으로 받아서 일정한 방식으로 그 패턴을 수정합니다. 예를 들어, optionalPattern은 가능한 경우 지정된 패턴이 일치하게 만들지만 성공적인 일치를 위해 이 패턴이 필수는 아닙니다.

txt = ["123abc" "abc"];
pat = optionalPattern(digitsPattern) + lettersPattern;
extract(txt,pat)
ans = 1x2 string
    "123abc"    "abc"

경계 패턴

경계 패턴은 특수한 유형의 패턴으로, 문자와 일치되는 대신에 지정된 문자 유형과 다른 문자들 간의 경계 또는 지정된 문자 유형과 해당 텍스트 조각의 시작이나 끝 간의 경계와 일치되는 패턴입니다. 예를 들어, digitBoundary는 숫자 문자와 숫자가 아닌 문자 간의 경계 및 숫자 문자와 텍스트의 시작이나 끝 간의 경계와 일치합니다. 숫자 문자 자체와는 일치하지 않습니다. 경계 패턴은 split 같은 함수의 구분 기호로 유용합니다.

txt = "123abc";
pat = digitBoundary;
split(txt,pat)
ans = 3x1 string
    ""
    "123"
    "abc"

경계 패턴은 not(~) 연산자를 사용하여 부정될 수 있기 때문에 패턴 중에서도 특별합니다. 경계 패턴은 이런 식으로 부정될 경우 위 요건을 충족하지 않은 문자 앞이나 뒤와 일치합니다. 예를 들어, ~digitBoundary는 다음 항목 사이의 경계와 일치합니다.

  • 둘 다 숫자인 문자

  • 둘 다 숫자가 아닌 문자

  • 숫자가 아닌 문자와 텍스트 조각의 처음 또는 끝

replace를 사용하여 ~digitBoundary가 일치하는 위치를 "|" 문자로 표시합니다.

txt = "123abc";
pat = ~digitBoundary;
replace(txt,pat,"|")
ans = 
"1|2|3a|b|c|"

복잡한 패턴을 단계별로 작성하기

때로는 간단한 패턴이 문제를 해결하기에 충분하지 않으며 더 복잡한 패턴이 필요합니다. 패턴 표현식이 길어지면서 일치하는 항목을 이해하기 어려워질 수 있습니다. 복잡한 패턴 작성을 간소화하는 한 가지 방법은 패턴의 각 부분을 별도로 작성한 다음 이를 하나의 패턴 표현식으로 조합하는 것입니다.

예를 들어, 이메일 주소는 local_part@domain.TLD 형식을 사용합니다. 세 개의 각 식별자(local_part, domain, TLD)는 숫자, 영문자, 밑줄 문자의 조합이어야 합니다. 전체 패턴을 작성하려면 식별자에 대한 패턴부터 정의하십시오. 하나의 영문자 또는 숫자 문자 또는 하나의 밑줄 문자를 일치시키는 패턴을 작성합니다.

identCharacters = alphanumericsPattern(1) | "_";

이제 asManyOfPattern을 사용하여 한 개 이상의 identCharacters 연속 인스턴스와 일치되도록 합니다.

identifier = asManyOfPattern(identCharacters,1);

다음으로 여러 식별자가 포함된 이메일과 일치하는 패턴을 작성합니다.

emailPattern = identifier + "@" + identifier + "." + identifier;

다음 예제 이메일과 얼마나 잘 일치하는지 확인하여 패턴을 테스트합니다.

exampleEmails = ["janedoe@mathworks.com" 
    "abe.lincoln@whitehouse.gov"
    "alberteinstein@physics.university.edu"];
matches(exampleEmails,emailPattern)
ans = 3x1 logical array

   1
   0
   0

이메일이 모두 유효하지만 패턴은 예제 이메일 몇 개와 일치하지 못합니다. local_part와 domain은 둘 다 마침표로 구분된 일련의 식별자로 구성될 수 있습니다. identifier 패턴을 사용하여 일련의 식별자와 일치할 수 있는 패턴을 작성합니다. asManyOfPattern은 지정된 패턴이 동시에 여러 번 나타나는 부분과 최대한 일치하지만, 지정된 패턴이 나타나지 않더라도 나머지 패턴은 여전히 성공적으로 일치할 수 있습니다.

identifierSeries = asManyOfPattern(identifier + ".") + identifier;

이 패턴을 사용하여 모든 예제 이메일과 일치할 수 있는 새로운 emailPattern을 작성합니다.

emailPattern = identifierSeries + "@" + identifierSeries + "." + identifier;
matches(exampleEmails,emailPattern)
ans = 3x1 logical array

   1
   1
   1

패턴 표시 구조화하기

복잡한 패턴은 경우에 따라 읽고 해석하기 어려울 수 있습니다. 패턴 구조에 익숙하지 않은 사람과 패턴을 공유할 경우 특히 그렇습니다. 예를 들어, emailPattern은 표시됐을 때 길고 읽기 어렵습니다.

emailPattern
emailPattern = pattern
  Matching:

    asManyOfPattern(asManyOfPattern(alphanumericsPattern(1) | "_",1) + ".") + asManyOfPattern(alphanumericsPattern(1) | "_",1) + "@" + asManyOfPattern(asManyOfPattern(alphanumericsPattern(1) | "_",1) + ".") + asManyOfPattern(alphanumericsPattern(1) | "_",1) + "." + asManyOfPattern(alphanumericsPattern(1) | "_",1)

표시와 관련된 문제 중 일부는 identifier 패턴이 많이 반복된다는 점입니다. 패턴 사용자에게 이 패턴의 정확한 세부 정보가 중요하지 않은 경우에는 maskedPattern을 사용하여 identifier 패턴의 표시를 숨길 수 있습니다. 이 함수는 identifier의 표시가 마스킹되고 대신 변수 이름인 "identifier"가 표시되는 새 패턴을 생성합니다. 또는 다른 이름이 표시되도록 지정할 수 있습니다. 이 방법으로 마스킹된 패턴의 세부 정보에 액세스하려면 표시된 패턴에서 "Show all details"를 클릭하면 됩니다.

identifier = maskedPattern(identifier);
identifierSeries = asManyOfPattern(identifier + ".") + identifier
identifierSeries = pattern
  Matching:

    asManyOfPattern(identifier + ".") + identifier

  Use details to show more information

namedPattern 함수를 사용하여 패턴을 한층 더 구조화할 수 있습니다. namedPattern은 패턴이 다른 패턴과 조합될 때 표시되는 방식을 변경하는 명명된 패턴으로 패턴을 지정합니다. 이메일 주소에는 몇 개의 중요한 부분이 있으며(local_part@domain.TLD) 각 부분마다 고유한 일치 규칙이 있습니다. 각 부분에 대한 명명된 패턴을 만듭니다.

localPart = namedPattern(identifierSeries,"local_part");

명명된 패턴은 패턴의 부분을 더 상세히 기술하기 위해 중첩될 수 있습니다. 명명된 패턴을 중첩하려면 명명된 패턴들을 사용하여 패턴을 작성한 다음 해당 패턴을 명명된 패턴으로 지정하십시오. 예를 들어, Domain.TLD는 도메인, 하위 도메인 및 최상위 도메인(TLD)으로 나눌 수 있습니다. domain.TLD의 각 부분에 대한 명명된 패턴을 만듭니다.

subdomain = namedPattern(identifierSeries,"subdomain");
domainName = namedPattern(identifier,"domainName");
tld = namedPattern(identifier,"TLD");

단일 명명된 패턴 domain 아래 domain의 컴포넌트에 대한 명명된 패턴을 중첩합니다.

domain = optionalPattern(subdomain + ".") + ...
            domainName + "." + ...
            tld;
domain = namedPattern(domain);

패턴을 단일 명명된 패턴인 emailPattern으로 함께 조합합니다. emailPattern 표시에서 각 명명된 패턴, 패턴이 일치하는 항목과 더불어 중첩된 명명된 패턴에 대한 정보를 볼 수 있습니다.

emailPattern = localPart + "@" + domain
emailPattern = pattern
  Matching:

    local_part + "@" + domain

  Using named patterns:

    local_part  : asManyOfPattern(identifier + ".") + identifier
    domain      : optionalPattern(subdomain + ".") + domainName + "." + TLD
      subdomain : asManyOfPattern(identifier + ".") + identifier
      domainName: identifier
      TLD       : identifier

  Use details to show more information

패턴에 대해 점 인덱싱을 사용하여 명명된 패턴 및 중첩된 명명된 패턴에 액세스할 수 있습니다. 예를 들어, emailPattern에서 domain으로 점 인덱싱한 다음 subdomain으로 다시 점 인덱싱하여 중첩된 명명된 패턴 subdomain에 액세스할 수 있습니다.

emailPattern.domain.subdomain
ans = pattern
  Matching:

    asManyOfPattern(identifier + ".") + identifier

  Use details to show more information

나머지 패턴 표현식을 다시 작성할 필요 없이 점 표기법을 사용하여 명명된 패턴을 변경할 수 있습니다.

emailPattern.domain = "mathworks.com"
emailPattern = pattern
  Matching:

    local_part + "@" + domain

  Using named patterns:

    local_part: asManyOfPattern(identifier + ".") + identifier
    domain    : "mathworks.com"

  Use details to show more information

Copyright 2020 The MathWorks, Inc.

참고 항목

| | | | |

관련 항목