Main Content

pattern

텍스트 검색 및 일치 패턴

R2020b 이후

설명

패턴contains, matches, extract 등의 텍스트 검색 함수를 사용하여 텍스트에서 일치하는 부분을 찾기 위한 규칙을 정의합니다. 패턴 함수, 연산자 및 리터럴 텍스트를 사용하여 패턴 표현식을 작성할 수 있습니다. 예를 들어, MATLAB® 릴리스 이름은 "R"로 시작하고 그 뒤에 네 자리 연도가 오고 다음으로 "a""b"가 옵니다. 다음과 같이 릴리스 이름의 형식과 일치하는 패턴을 정의합니다.

pat = "R" + digitsPattern(4) + ("a"|"b");

다음과 같이 문자열에서 해당 패턴과 일치하는 부분을 찾습니다.

str = ["String was introduced in R2016b." 
       "Pattern was added in R2020b."];
extract(str,pat)
ans =
  2x1 string array
    "R2016b"
    "R2020b"

생성

패턴은 +, |, ~ 연산자를 사용하여 리터럴 텍스트 및 다른 패턴으로 구성됩니다. 객체 함수를 사용하여 공통된 패턴을 만들 수도 있습니다. 이러한 함수는 종종 정규 표현식과 관련된 다음과 같은 규칙을 사용합니다.

  • 문자 일치 패턴 – 문자 또는 숫자의 범위, 와일드카드 또는 공백(예: lettersPattern).

  • 검색 규칙 – 패턴이 나타나야 하는 횟수, 대/소문자 구분, 선택적 패턴 및 명명된 표현식(예: asManyOfPatternoptionalPattern).

  • 경계 – 연속된 특정 문자의 시작 부분이나 끝부분의 경계(예: alphanumericBoundary). 경계 패턴에 ~ 연산자를 사용하면, 경계와 일치하는 부분이 경계의 패턴 표현식과 일치하지 않게 됩니다.

  • 패턴 구성 – 패턴 구조를 정의하고 패턴 표현식이 표시되는 방식을 지정합니다(예: maskedPatternnamedPattern).

함수 pattern은 또한 구문 pat = pattern(txt)를 사용하여 패턴 함수를 만듭니다. 여기서 txtpat와 일치하는 리터럴 텍스트입니다. 패턴 함수는 함수 인수 유효성 검사를 위한 패턴 유형을 지정하는 데 유용합니다. 그러나 MATLAB 텍스트 일치 함수는 텍스트 입력값을 받기 때문에 다른 경우에는 pattern 함수가 거의 필요하지 않습니다.

객체 함수

모두 확장

containsstring형에 패턴이 있는지 확인
matches패턴이 문자열과 일치하는지 확인
count문자열 내의 패턴 일치 횟수 세기
endsWith문자열이 패턴으로 끝나는지 여부 확인
startsWith문자열이 패턴으로 시작하는지 여부 확인
extract문자열에서 부분문자열 추출하기
replace하나 이상의 부분문자열 찾아 바꾸기
replaceBetweenReplace substrings between start and end points
split구분 기호에서 문자열 분할
erase문자열 내에 있는 부분문자열 삭제
eraseBetween시작 지점과 끝 지점 사이에 있는 부분문자열 삭제
extractAfter지정된 위치 뒤에 있는 부분문자열 추출
extractBefore지정된 위치 앞에 있는 부분문자열 추출
extractBetween시작 지점과 끝 지점 사이에 있는 부분문자열 추출
insertAfter지정된 부분문자열 다음에 문자열 삽입
insertBefore지정된 부분문자열 앞에 문자열 삽입
digitsPattern 숫자 문자 일치
lettersPatternMatch letter characters
alphanumericsPatternMatch letter and digit characters
characterListPatternMatch characters from list
whitespacePatternMatch whitespace characters
wildcardPatternMatches as few characters of any type
optionalPatternMake pattern optional to match
possessivePatternMatch pattern without backtracking
caseSensitivePatternMatch pattern with case sensitivity
caseInsensitivePatternMatch pattern regardless of case
asFewOfPatternMatch pattern as few times as possible
asManyOfPatternMatch pattern as many times as possible
alphanumericBoundaryMatch boundary between alphanumeric and non-alphanumeric characters
digitBoundaryMatch boundary between digit characters and non-digit characters
letterBoundaryMatch boundary between letter characters and non-letter characters
whitespaceBoundaryMatch boundary between whitespace characters and non-whitespace characters
lineBoundaryMatch start or end of line
textBoundaryMatch start or end of text
lookAheadBoundaryMatch boundary before specified pattern
lookBehindBoundaryMatch boundary following specified pattern
regexpPatternPattern that matches specified regular expression
maskedPatternPattern with specified display name
namedPatternDesignate named pattern

예제

모두 축소

lettersPattern은 영문자와 일치하는 일반적인 문자 일치 패턴입니다. 하나 이상의 영문자와 일치하는 패턴을 만듭니다.

txt = ["This" "is a" "1x6" "string" "array" "."];
pat = lettersPattern;

contains를 사용하여 각 문자열에 pat와 일치하는 문자가 있는지 확인합니다. 출력 논리형 배열은 txt의 문자열 중 처음 5개에는 문자가 포함되어 있지만 6번째 문자열에는 문자가 없음을 나타냅니다.

contains(txt,pat)
ans = 1x6 logical array

   1   1   1   1   1   0

텍스트가 지정된 패턴으로 시작하는지 확인합니다. 출력 논리형 배열은 txt의 문자열 중 4개가 문자로 시작하고 2개는 문자로 시작하지 않음을 나타냅니다.

startsWith(txt,pat)
ans = 1x6 logical array

   1   1   0   1   1   0

문자열이 지정된 패턴과 완전히 일치하는지 확인합니다. 출력 논리형 배열은 txt의 문자열 중 문자 외에 아무것도 포함하지 않는 문자열을 나타냅니다.

matches(txt,pat)
ans = 1x6 logical array

   1   0   0   1   1   0

패턴이 일치한 횟수를 셉니다. 출력 숫자형 배열은 txt의 각 요소에서 lettersPattern의 일치 횟수를 나타냅니다. lettersPattern은 하나 이상의 문자와 일치하기 때문에 함께 붙어 있는 영문자들의 그룹은 단일 일치가 된다는 점에 유의하십시오.

count(txt,pat)
ans = 1×6

     1     2     1     1     1     0

digitsPattern은 숫자 문자와 일치하는 일반적인 문자 일치 패턴입니다. 숫자 문자와 일치하는 패턴을 만듭니다.

txt = ["1 fish" "2 fish" "[1,0,0] fish" "[0,0,1] fish"];
pat = digitsPattern;

replace 를 사용하여 텍스트에서 패턴과 일치하는 부분을 편집합니다.

replace(txt,pat,"#")
ans = 1x4 string
    "# fish"    "# fish"    "[#,#,#] fish"    "[#,#,#] fish"

일치하는 문자 뒤에 "!" 문자를 삽입하여 텍스트의 새로운 부분을 만듭니다.

insertAfter(txt,pat,"!")
ans = 1x4 string
    "1! fish"    "2! fish"    "[1!,0!,0!] fish"    "[0!,0!,1!] fish"

텍스트와 함께 OR 연산자 |를 사용하여 패턴을 만들 수 있습니다. 지정된 패턴과 일치하는 텍스트를 지웁니다.

txt = erase(txt,"," | "]" | "[")
txt = 1x4 string
    "1 fish"    "2 fish"    "100 fish"    "001 fish"

새 텍스트에서 pat를 추출합니다.

extract(txt,pat)
ans = 1x4 string
    "1"    "2"    "100"    "001"

패턴을 사용하여 텍스트에서 개별 문자가 나타나는 횟수를 셉니다.

txt = "She sells sea shells by the sea shore.";

alphanumericsPattern을 사용하여 개별 문자와 일치하는 pattern 객체로 pat를 만듭니다. 패턴을 추출합니다.

pat = alphanumericsPattern(1);
letters = extract(txt,pat);

각 문자의 발생 횟수의 히스토그램을 표시합니다.

letters = lower(letters);
letters = categorical(letters);
histogram(letters)

Figure contains an axes object. The axes object contains an object of type categoricalhistogram.

maskedPattern을 사용하여 복잡한 패턴 표현식 대신에 변수를 표시합니다.

숫자와 산술 연산자로 구성된 단순한 산술 표현식과 일치하는 패턴을 만듭니다.

mathSymbols = asManyOfPattern(digitsPattern | characterListPattern("+-*/="),1)
mathSymbols = pattern
  Matching:

    asManyOfPattern(digitsPattern | characterListPattern("+-*/="),1)

mathSymbols를 사용하여 문자 사이에 공백이 있는 산술 표현식과 일치하는 패턴을 만듭니다.

longExpressionPat = asManyOfPattern(mathSymbols + whitespacePattern) + mathSymbols
longExpressionPat = pattern
  Matching:

    asManyOfPattern(asManyOfPattern(digitsPattern | characterListPattern("+-*/="),1) + whitespacePattern) + asManyOfPattern(digitsPattern | characterListPattern("+-*/="),1)

표시된 패턴 표현식은 길어서 읽기 어렵습니다. maskedPattern을 사용하여 패턴 표현식 대신에 변수 이름 mathSymbols를 표시합니다.

mathSymbols = maskedPattern(mathSymbols);
shortExpressionPat = asManyOfPattern(mathSymbols + whitespacePattern) + mathSymbols
shortExpressionPat = pattern
  Matching:

    asManyOfPattern(mathSymbols + whitespacePattern) + mathSymbols

  Use details to show more information

산술 표현식을 포함하는 문자열을 만든 다음 텍스트에서 패턴을 추출합니다.

txt = "What is the answer to 1 + 1? Oh, I know! 1 + 1 = 2!";
arithmetic = extract(txt,shortExpressionPat)
arithmetic = 2x1 string
    "1 + 1"
    "1 + 1 = 2"

명명된 패턴 2개에서 패턴을 만듭니다. 패턴 이름 설정은 패턴의 표시에 컨텍스트를 추가합니다.

패턴 2개를 만듭니다. 한 패턴은 문자 D로 시작하고 끝나는 단어와 일치하고, 다른 한 패턴은 문자 R로 시작하고 끝나는 단어와 일치합니다.

dWordsPat = letterBoundary + caseInsensitivePattern("d" + lettersPattern + "d") + letterBoundary;
rWordsPat = letterBoundary + caseInsensitivePattern("r" + lettersPattern + "r") + letterBoundary;

D로 시작하고 끝나는 단어를 찾은 다음 R로 시작하고 끝나는 단어를 찾는 명명된 패턴을 사용하여 패턴을 만듭니다.

dAndRWordsPat = dWordsPat + whitespacePattern + rWordsPat
dAndRWordsPat = pattern
  Matching:

    letterBoundary + caseInsensitivePattern("d" + lettersPattern + "d") + letterBoundary + whitespacePattern + letterBoundary + caseInsensitivePattern("r" + lettersPattern + "r") + letterBoundary

이 패턴은 읽기 어려우며 그 목적에 관한 많은 정보를 전달하지 않습니다. namedPattern을 사용하여 패턴을 패턴 표현식 대신에 지정된 이름과 설명을 표시하는 명명된 패턴으로 지정합니다.

dWordsPat = namedPattern(dWordsPat,"dWords", "Words that start and end with D");
rWordsPat = namedPattern(rWordsPat,"rWords", "Words that start and end with R");
dAndRWordsPat = dWordsPat + whitespacePattern + rWordsPat
dAndRWordsPat = pattern
  Matching:

    dWords + whitespacePattern + rWords

  Using named patterns:

    dWords: Words that start and end with D
    rWords: Words that start and end with R

  Use details to show more information

문자열을 만들고 패턴과 일치하는 텍스트를 추출합니다.

txt = "Dad, look at the divided river!";
words = extract(txt,dAndRWordsPat)
words = 
"divided river"

이메일 주소와 일치하는 읽기 쉬운 패턴을 만듭니다.

이메일 주소는 username@domain.TLD 구조를 따릅니다. 여기서 usernamedomain은 마침표로 구분된 식별자로 구성됩니다. 영숫자 문자 및 "_" 문자의 조합으로 구성된 식별자와 일치하는 패턴을 만듭니다. maskedPattern을 사용하여 이 패턴을 identifier로 명명합니다.

identifier = asManyOfPattern(alphanumericsPattern(1) | "_", 1);
identifier = maskedPattern(identifier);

식별자로 구성된 도메인 및 하위 도메인과 일치하는 패턴을 만듭니다. 지정된 목록에서 TLD와 일치하는 패턴을 만듭니다.

subdomain = asManyOfPattern(identifier + ".") + identifier;
domainName = namedPattern(identifier,"domainName");
tld = "com" | "org" | "gov" | "net" | "edu";

이메일의 국소 부분이 일치하는 패턴을 만듭니다. 여기서 이메일은 마침표로 구분된 하나 이상의 식별자와 일치합니다. 위에 정의한 패턴을 조합하여 도메인, TLD 및 잠재적 하위 도메인이 일치하는 패턴을 만듭니다. namedPattern을 사용하여 이러한 패턴들을 각각 명명된 패턴에 대입합니다.

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

모든 패턴을 하나의 패턴 표현식으로 결합합니다. namedPattern을 사용하여 username, domainemailPattern을 명명된 패턴에 대입합니다.

emailAddress = namedPattern(username) + "@" + namedPattern(domain);
emailPattern = namedPattern(emailAddress)
emailPattern = pattern
  Matching emailAddress:

    username + "@" + domain

  Using named patterns:

    emailAddress  : username + "@" + domain
      username    : asManyOfPattern(identifier + ".") + identifier
      domain      : optionalPattern(subdomain + ".") + domainName + "." + tld
        subdomain : asManyOfPattern(identifier + ".") + identifier
        domainName: identifier
        tld       : "com" | "org" | "gov" | "net" | "edu"

  Use details to show more information

이메일 주소를 포함하는 문자열을 만든 다음 텍스트에서 패턴을 추출합니다.

txt = "You can reach me by email at John.Smith@department.organization.org";
extract(txt,emailPattern)
ans = 
"John.Smith@department.organization.org"

명명된 패턴은 명명된 부분패턴에 액세스할 수 있도록 점 인덱싱을 허용합니다. 점 인덱싱을 사용하여 명명된 패턴 domain에 특정 값을 대입합니다.

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

    username + "@" + domain

  Using named patterns:

    emailAddress: username + "@" + domain
      username  : asManyOfPattern(identifier + ".") + identifier
      domain    : "mathworks.com"

  Use details to show more information

확장 기능

스레드 기반 환경
MATLAB®의 backgroundPool을 사용해 백그라운드에서 코드를 실행하거나 Parallel Computing Toolbox™의 ThreadPool을 사용해 코드 실행 속도를 높일 수 있습니다.

버전 내역

R2020b에 개발됨