패턴 표현식 작성하기
R2020b 이상
패턴은 텍스트를 검색하고 수정하는 데 도움이 되는 도구입니다. 정규 표현식과 유사하게 패턴은 텍스트에서 일치하는 부분을 찾기 위한 규칙을 정의합니다. 패턴을 contains
, matches
, extract
와 같은 텍스트 검색 함수와 함께 사용하여 텍스트의 어느 부분에 이러한 함수가 작업을 수행할지 지정할 수 있습니다. 패턴 표현식은 패턴 함수, 연산자 및 리터럴 텍스트를 사용하여 수학 표현식과 유사한 방식으로 작성할 수 있습니다. 패턴 표현식을 작성하는 데는 제약이 없기 때문에 패턴이 상당히 복잡해질 수 있습니다. 패턴을 단계별로 작성하고 maskedPattern
과 namedPattern
같은 함수를 사용하면 복잡한 패턴을 구조화하는 데 도움이 됩니다.
간단한 패턴 작성하기
가장 간단한 패턴은 단일 패턴 함수로 작성됩니다. 예를 들어, 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
Show all details
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
Show all details
패턴에 대해 점 인덱싱을 사용하여 명명된 패턴 및 중첩된 명명된 패턴에 액세스할 수 있습니다. 예를 들어, emailPattern
에서 domain
으로 점 인덱싱한 다음 subdomain
으로 다시 점 인덱싱하여 중첩된 명명된 패턴 subdomain
에 액세스할 수 있습니다.
emailPattern.domain.subdomain
ans = pattern
Matching:
asManyOfPattern(identifier + ".") + identifier
Show all details
나머지 패턴 표현식을 다시 작성할 필요 없이 점 표기법을 사용하여 명명된 패턴을 변경할 수 있습니다.
emailPattern.domain = "mathworks.com"
emailPattern = pattern
Matching:
local_part + "@" + domain
Using named patterns:
local_part: asManyOfPattern(identifier + ".") + identifier
domain : "mathworks.com"
Show all details
Copyright 2020 The MathWorks, Inc.
참고 항목
pattern
| string
| regexp
| contains
| replace
| extract