Excel에서 문자열을 추출하는 정규식(하나 또는 모두 일치)

  • 이 공유
Michael Brown

이 자습서에서는 Excel에서 정규식을 사용하여 주어진 패턴과 일치하는 하위 문자열을 찾고 추출하는 방법을 배웁니다.

Microsoft Excel은 텍스트를 추출하는 다양한 기능을 제공합니다. 세포에서. 이러한 함수는 워크시트에서 대부분의 문자열 추출 문제를 처리할 수 있습니다. 대부분이지만 전부는 아닙니다. Text 함수가 비틀거리면 정규식이 구출됩니다. 잠깐... Excel에는 RegEx 함수가 없습니다! 사실, 내장 기능이 없습니다. 그러나 자신의 것을 사용하는 것을 방해하는 것은 없습니다 :)

    문자열을 추출하는 Excel VBA 정규식 함수

    사용자 지정 정규식 추출 함수를 Excel에 추가하려면, VBA 편집기에 다음 코드를 붙여넣습니다. VBA에서 정규식을 활성화하기 위해 내장된 Microsoft RegExp 객체를 사용하고 있습니다.

    Public Function RegExpExtract(text As String , pattern As String , Optional instance_num As Integer = 0, 선택적 match_case As Boolean = True ) Dim text_matches() As String Dim matches_index As Integer On Error GoTo ErrHandl RegExpExtract = "" Set regex = CreateObject ( "VBScript.RegExp" ) regex.pattern = pattern regex.Global = True regex.MultiLine = True If True = match_case Then regex. ignorecase = False Else regex.ignorecase = True End If Set matches = regex.Execute(text) If 0 < matches.Count Then If (0 = instance_num) Then ReDim text_matches(matches.Count - 1, 0) For matches_index = 0 ToVBA RegExp, 훨씬 더 강력한 .NET Regex 함수에 대해 설명하는 다음 부분을 읽어 보시기 바랍니다.

    Excel에서 텍스트를 추출하는 사용자 지정 .NET 기반 Regex 함수

    VBA RegExp 함수와 달리 모든 Excel 사용자가 작성할 수 있으며 .NET RegEx는 개발자의 영역입니다. Microsoft .NET Framework는 Perl 5와 호환되는 모든 기능을 갖춘 정규식 구문을 지원합니다. 이 기사에서는 이러한 함수를 작성하는 방법을 설명하지 않습니다(저는 프로그래머가 아니며 작성 방법에 대해 조금도 모릅니다 :)

    표준 .NET RegEx 엔진에서 처리되는 네 가지 강력한 기능은 이미 개발자가 작성했으며 Ultimate Suite에 포함되어 있습니다. 아래에서는 Excel에서 텍스트를 추출하기 위해 특별히 설계된 기능의 몇 가지 실용적인 사용을 보여줍니다.

    팁. .NET Regex 구문에 대한 자세한 내용은 .NET 정규식 언어를 참조하십시오.

    정규식을 사용하여 Excel에서 문자열을 추출하는 방법

    최신 버전의 Ultimate Suite가 설치되어 있다고 가정하면 정규식을 사용하여 텍스트를 추출하는 방법은 다음 두 단계로 요약됩니다.

    1. Ablebits 데이터 탭의 텍스트 그룹에서 Regex 도구 를 클릭합니다.
    2. 정규식 도구 창에서 소스 데이터를 선택하고 정규식 패턴을 입력한 다음 추출 옵션을 선택합니다. 값이 아닌 사용자 정의 함수로 결과를 얻으려면 공식으로 삽입 확인을 선택하십시오.상자. 완료되면 추출 버튼을 클릭합니다.

    결과는 원본 데이터 오른쪽의 새 열에 표시됩니다.

    AblebitsRegexExtract 구문

    사용자 지정 함수의 구문은 다음과 같습니다.

    AblebitsRegexExtract(reference, regular_expression)

    여기서:

    • Reference (필수) - 소스 문자열을 포함하는 셀에 대한 참조입니다.
    • Regular_expression (필수) - 일치시킬 정규식 패턴입니다.

    중요 참고 사항! 이 기능은 Ultimate Suite for Excel이 설치된 컴퓨터에서만 작동합니다.

    사용 참고 사항

    학습 곡선을 원활하게 하고 경험을 더 즐겁게 하려면 다음 사항에 주의하십시오.

    1. 수식을 만들려면 정규식 도구 또는 Excel의 함수 삽입 대화 상자를 사용하거나 셀에 전체 함수 이름을 입력할 수 있습니다. 수식이 삽입되면 기본 수식처럼 관리(편집, 복사 또는 이동)할 수 있습니다.
    2. 정규식 도구 창에 입력한 패턴은 두 번째 인수로 이동합니다. 정규식을 별도의 셀에 보관하는 것도 가능합니다. 이 경우 두 번째 인수에 대한 셀 참조를 사용하십시오.
    3. 함수는 처음 찾은 일치 항목 을 추출합니다.
    4. 기본적으로 함수는 케이스입니다. -민감한 . 대소문자를 구분하지 않는 일치의 경우 (?i) 패턴을 사용합니다.
    5. 일치하는 항목이 없으면 #N/A 오류가 발생합니다.반환됩니다.

    두 문자 사이의 문자열을 추출하는 Regex

    두 문자 사이의 텍스트를 가져오려면 캡처 그룹이나 둘러보기를 사용할 수 있습니다.

    하자 대괄호 사이의 텍스트를 추출하려고 한다고 가정해 보겠습니다. 캡처 그룹이 가장 쉬운 방법입니다.

    패턴 1 : \[(.*?)\]

    긍정적인 뒤돌아보기와 미리보기를 사용하면 결과는 정확히 동일합니다.

    패턴 2 : (?<=\[)(.*?)(?=\])

    캡처 그룹이 (.*?)는 첫 번째 [에서 첫 번째 ]까지 두 대괄호 사이의 텍스트에 대해 지연 검색 을 수행합니다. 물음표(.*)가 없는 캡처 그룹은 탐욕스러운 검색 을 수행하고 처음 [부터 마지막 ​​]까지 모두 캡처합니다.

    A2의 패턴을 사용하면 공식은 다음과 같습니다.

    =AblebitsRegexExtract(A5, $A$2)

    모든 일치 항목을 가져오는 방법

    이미 언급했듯이 AblebitsRegexExtract 함수는 하나의 일치 항목만 추출할 수 있습니다. 모든 일치 항목을 얻으려면 앞에서 설명한 VBA 기능을 사용할 수 있습니다. 그러나 한 가지 주의할 점이 있습니다. VBA RegExp는 캡처 그룹을 지원하지 않으므로 위의 패턴은 "경계" 문자도 반환합니다. 우리의 경우 대괄호입니다.

    =TEXTJOIN(" ", TRUE, RegExpExtract(A5, $A$2))

    제거하려면 다음 공식을 사용하여 대괄호를 빈 문자열("")로 대체하십시오.

    =SUBSTITUTE(SUBSTITUTE(TEXTJOIN(", ", TRUE, RegExpExtract(A5, $A$2)), "]", ""),"[","")

    가독성을 높이기 위해 구분 기호로 쉼표를 사용합니다.

    두 문자열 사이의 텍스트를 추출하는 Regex

    우리가 작업한 접근 방식문자 그대로 해석).

  • (?:[A-Za-z\d\-\.]{2,255}\.)? - 3단계, 4단계 등의 도메인을 식별하기 위한 비캡처 그룹(샘플 URL의 mobile ). 첫 번째 패턴에서는 추출에 포함된 모든 하위 도메인을 얻기 위해 더 큰 캡처링 그룹 내에 배치됩니다. 하위 도메인의 길이는 2~255자일 수 있으므로 {2,255} 한정 기호입니다.
  • ([A-Za-z\d\-]{1,63}\.[A-Za-z] {2,24}) - 그룹을 캡처하여 두 번째 수준 도메인( ablebits ) 및 최상위 도메인( com )을 추출합니다. 두 번째 수준 도메인의 최대 길이는 63자입니다. 현재 존재하는 가장 긴 최상위 도메인은 24자를 포함합니다.
  • A2에 어떤 정규식을 입력하느냐에 따라 아래 수식은 다른 결과를 생성합니다.

    =AblebitsRegexExtract(A5, $A$2)

    모든 하위 도메인이 있는 전체 도메인 이름 을 추출하는 정규식:

    하위 도메인 없이 두 번째 수준 도메인 을 추출하는 정규식:

    정규식을 사용하여 Excel에서 텍스트의 일부를 추출하는 방법입니다. 읽어 주셔서 감사합니다. 다음 주 블로그에서 뵙겠습니다!

    사용 가능한 다운로드

    Excel 정규식 추출 예제(.xlsm 파일)

    Ultimate Suite 평가판 (.exe 파일)

    \b(0?[0-9]matches.Count - 1 text_matches(matches_index, 0) = matches.Item(matches_index) 다음 matches_index RegExpExtract = text_matches Else RegExpExtract = matches.Item(instance_num - 1) End If End If Exit Function ErrHandl: RegExpExtract = CVErr(xlErrValue) End Function

    VBA에 대한 경험이 거의 없는 경우 단계별 사용자 가이드(Excel에 VBA 코드 삽입 방법)가 도움이 될 수 있습니다.

    참고. 기능이 작동하려면 파일을 매크로 사용 통합 문서 (.xlsm)로 저장해야 합니다.

    RegExpExtract 구문

    RegExpExtract 함수는 입력 문자열에서 정규 표현식과 일치하는 값을 검색하고 하나 또는 모든 일치 항목을 추출합니다.

    이 함수의 구문은 다음과 같습니다. :

    RegExpExtract(text, pattern, [instance_num], [match_case])

    Where:

    • Text (필수) - 검색할 텍스트 문자열입니다.
    • Pattern (필수) - 일치시킬 정규식입니다. 수식에 직접 제공되는 경우 패턴을 큰따옴표로 묶어야 합니다.
    • Instance_num (선택 사항) - 추출할 인스턴스를 나타내는 일련 번호입니다. 생략하면 찾은 모든 일치 항목을 반환합니다(기본값).
    • Match_case (선택 사항) - 텍스트 대소문자를 일치시킬지 무시할지 정의합니다. TRUE이거나 생략된 경우(기본값), 대소문자 구분 일치가 수행됩니다. FALSE인 경우 - 대소문자를 구분하지 않습니다.

    이 함수는 Excel 365, Excel 2021, Excel의 모든 버전에서 작동합니다.2019, Excel 2016, Excel 2013 및 Excel 2010.

    RegExpExtract

    에 대해 알아야 할 4가지 사항 Excel에서 함수를 효과적으로 사용하려면 다음과 같은 몇 가지 중요한 사항에 유의해야 합니다.

    1. 기본적으로 이 함수는 발견된 모든 일치 항목 을 이 예와 같이 인접 셀에 반환합니다. 특정 항목을 얻으려면 instance_num 인수에 해당 번호를 제공하십시오.
    2. 기본적으로 함수는 대소문자를 구분 합니다. 대소문자를 구분하지 않는 일치의 경우 match_case 인수를 FALSE로 설정합니다. VBA 제한으로 인해 대소문자를 구분하지 않는 구문(?i)이 작동하지 않습니다.
    3. 유효한 패턴을 찾을 수 없는 경우 함수는 아무것도 반환하지 않습니다(빈 문자열).
    4. 패턴이 유효하지 않은 경우 #VALUE! 오류가 발생합니다.

    워크시트에서 이 사용자 정의 기능을 사용하기 전에 기능이 무엇인지 이해해야 합니다. 아래 예는 몇 가지 일반적인 사용 사례를 다루고 Dynamic Array Excel(Microsoft 365 및 Excel 2021)과 기존 Excel(2019 및 이전 버전)에서 동작이 다를 수 있는 이유를 설명합니다.

    참고. 아웃 정규식 예제는 간단한 데이터 세트에 대해 작성되었습니다. 실제 워크시트에서 완벽하게 작동한다고 보장할 수 없습니다. 정규식에 대한 경험이 있는 사람들은 정규식을 작성하는 것이 완벽을 향한 끝없는 길이라는 데 동의할 것입니다.더 우아하거나 더 넓은 범위의 입력 데이터를 처리할 수 있습니다.

    문자열에서 숫자를 추출하는 Regex

    "단순에서 복잡한 것으로" 교육의 기본 격언에 따라 문자열에서 숫자를 추출하는 매우 평범한 경우부터 시작하겠습니다.

    The 가장 먼저 결정해야 할 것은 검색할 번호입니다: 첫 번째, 마지막, 특정 발생 또는 모든 번호.

    첫 번째 번호 추출

    정규식만큼 간단합니다. \d는 0에서 9까지의 숫자를 의미하고 +는 1회 이상을 의미하므로 정규 표현식은 다음 형식을 취합니다.

    패턴 : \d+

    Set instance_num 을 1로 설정하면 원하는 결과를 얻을 수 있습니다.

    =RegExpExtract(A5, "\d+", 1)

    여기서 A5는 원래 문자열입니다.

    편의상 다음과 같이 입력할 수 있습니다. 패턴을 사전 정의된 셀($A$2 )에 저장하고 $ 기호로 해당 주소를 잠급니다.

    =RegExpExtract(A5, $A$2, 1)

    마지막 번호 가져오기

    문자열에서 마지막 번호 추출 , 사용할 패턴은 다음과 같습니다.

    패턴 : (\d+)(?!.*\d)

    인간 언어로 번역됨 , 그것은 다음과 같이 말합니다 : 다른 숫자가 뒤따르지 않는 숫자를 찾으십시오. 이를 표현하기 위해 음수 예측(?!.*\d)을 사용하고 있습니다. 즉, 패턴 오른쪽에는 앞에 몇 개의 다른 문자가 있든 관계없이 다른 숫자(\d)가 없어야 합니다.

    =RegExpExtract(A5, "(\d+)(?!.*\d)")

    팁:

    • 특정 항목 을 가져오려면 패턴 에 \d+를 사용하고 적절한 일련 번호를 입력하세요.number for instance_num .
    • 모든 숫자 를 추출하는 공식은 다음 예에서 설명합니다.

    모든 일치 항목을 추출하는 Regex

    예제를 조금 더 진행하여 문자열에서 하나가 아닌 모든 숫자를 얻고 싶다고 가정해 보겠습니다.

    기억하시겠지만 추출된 일치 항목의 수는 선택적 instance_num 인수. 기본값은 모두 일치이므로 다음 매개변수를 생략하면 됩니다.

    =RegExpExtract(A2, "\d+")

    수식은 단일 셀에 대해 훌륭하게 작동하지만 동적 배열 Excel과 비동적 버전에서는 동작이 다릅니다.

    Excel 365 및 Excel 2021

    동적 배열 지원으로 인해 일반 수식이 계산된 모든 결과를 표시하는 데 필요한 만큼의 셀에 자동으로 분할됩니다. Excel에서는 이를 유출 범위라고 합니다.

    Excel 2019 이하

    사전 동적 Excel에서 위 수식은 일치 항목을 하나만 반환합니다. 일치 항목을 여러 개 얻으려면 배열 수식으로 만들어야 합니다. 이를 위해 셀 범위를 선택하고 수식을 입력한 다음 Ctrl + Shift + Enter를 눌러 완료합니다.

    이 접근 방식의 단점은 "추가 셀"에 #N/A 오류가 많이 나타난다는 것입니다. . 유감스럽게도 그것에 대해 아무것도 할 수 없습니다(IFERROR도 IFNA도 문제를 고칠 수 없습니다).

    하나의 셀에서 모든 일치 항목 추출

    데이터 열을 처리할 때 위의 접근 방식은 확실히 작동하지 않습니다. 이 경우 이상적인 솔루션단일 셀에서 모든 일치 항목을 반환합니다. 완료하려면 RegExpExtract의 결과를 TEXTJOIN 함수에 제공하고 원하는 구분 기호(예: 쉼표 및 공백)로 구분합니다.

    =TEXTJOIN(", ", TRUE, RegExpExtract(A5, "\d+"))

    참고. TEXTJOIN 함수는 Microsoft 365, Excel 2021 및 Excel 2019용 Excel에서만 사용할 수 있으므로 이전 버전에서는 수식이 작동하지 않습니다.

    Regex to extract text from string

    Extracting text from 영숫자 문자열은 Excel에서 상당히 어려운 작업입니다. 정규식을 사용하면 파이만큼 쉬워집니다. 부정 클래스를 사용하여 숫자가 아닌 모든 것을 일치시키십시오.

    패턴 : [^\d]+

    개별 셀에서 하위 문자열을 가져오려면(범위 확장) , 수식은 다음과 같습니다.

    =RegExpExtract(A5, "[^\d]+")

    모든 일치 항목을 하나의 셀에 출력하려면 다음과 같이 TEXTJOIN에 RegExpExtract 함수를 중첩합니다.

    =TEXTJOIN("", TRUE, RegExpExtract(A5, "[^\d]+"))

    Regex to 문자열에서 이메일 주소 추출

    다양한 정보가 많이 포함된 문자열에서 이메일 주소를 추출하려면 이메일 주소 구조를 복제하는 정규식을 작성하세요.

    패턴 : [\w\.\-]+@[A-Za-z0-9\.\-]+\.[A-Za-z]{2,24}

    이 정규식 분석 , 다음과 같이 표시됩니다.

    • [\w\.\-]+는 하나 이상의 영숫자 문자, 밑줄, 점 및 하이픈을 포함할 수 있는 사용자 이름입니다.
    • @ 기호
    • [A-Za-z0-9\.\-]+는 대문자와 소문자, 숫자, 하이픈 및 점으로 구성된 도메인 이름입니다.서브도메인). 여기서 밑줄은 허용되지 않으므로 모든 문자, 숫자 또는 밑줄과 일치하는 \w 대신 3개의 다른 문자 집합(예: A-Z a-z 및 0-9)이 사용됩니다.
    • \.[A-Za-z ]{2,24}는 최상위 도메인입니다. 대문자와 소문자가 뒤따르는 점으로 구성됩니다. 대부분의 최상위 도메인은 3글자 길이이지만(예: .com .org, .edu 등) 이론상 2~24글자(등록된 TLD 중 가장 긴 길이)를 포함할 수 있습니다.

    문자열이 A5에 있고 패턴이 A2에 있다고 가정하면 이메일 주소를 추출하는 공식은 다음과 같습니다.

    =RegExpExtract(A5, $A$2)

    Regex to extract domain from email

    이메일 도메인을 추출할 때 가장 먼저 떠오르는 생각은 캡처 그룹을 사용하여 @ 문자 바로 뒤에 오는 텍스트를 찾는 것입니다.

    패턴 : @([A-Za-z0 -9\.\-]+\.[A-Za-z]{2,24})

    RegExp 함수에 제공:

    =RegExpExtract(A5, "@([A-Za-z0-9\.\-]+\.[A-Za-z]{2,24})")

    그리고 다음 결과를 얻을 수 있습니다.

    클래식 정규식을 사용하면 캡처 그룹 외부에 있는 항목은 추출에 포함되지 않습니다. VBA RegEx가 다르게 작동하고 "@"도 캡처하는 이유는 아무도 모릅니다. 이를 없애기 위해 빈 문자열로 대체하여 결과에서 첫 번째 문자를 제거할 수 있습니다.

    =REPLACE(RegExpExtract(A5, "@([a-z\d][a-z\d\-\.]*\.[a-z]{2,})", 1, FALSE), 1, 1, "")

    전화번호를 추출하는 정규식

    전화번호 다양한 방법으로 작성할 수 있기 때문에 모든 환경에서 작동하는 솔루션을 찾는 것이 거의 불가능합니다.(\d{4}from string

    날짜를 추출하기 위한 정규식은 문자열 내에서 날짜가 나타나는 형식에 따라 다릅니다. 예:

    1/1/21 또는 01/01/2021과 같은 날짜를 추출하려면 정규식은 다음과 같습니다. \d{1,2}\/\d{1,2}\/(\d {4}상황. 그럼에도 불구하고 데이터세트에 사용된 모든 형식을 기록하고 일치시키려고 시도할 수 있습니다.

    이 예에서는 다음 형식으로 전화번호를 추출하는 정규식을 만들 것입니다.

    (123) 345-6789

    (123) 345 6789

    (123)3456789

    123- 345-6789

    123.345.6789

    123 345 6789

    1233456789

    패턴 : \(?\d{3}[-\. \)]*\d{3}[-\. ]?\d{4}\b

    • 첫 번째 부분 \(?\d{3}은 0개 또는 1개의 여는 괄호 다음에 3자리 d{3}가 오는 것과 일치합니다.
    • [-\. \)]* 부분은 하이픈, 마침표, 공백 또는 닫는 괄호와 같이 0번 이상 나타나는 대괄호 안의 모든 문자를 의미합니다.
    • 다음으로 다시 세 자리 숫자 d{3}와 하이픈, 마침표 또는 공백 [-\. ]? 0 또는 1회 나타납니다.
    • 그 다음에는 4자리 \d{4} 그룹이 있습니다.
    • 마지막으로 전화번호를 정의하는 단어 경계 \b가 있습니다. 찾고 있는 은(는) 더 큰 숫자의 일부가 될 수 없습니다.

    완전한 수식은 다음과 같은 형태를 취합니다.

    =RegExpExtract(A5, "\(?\d{3}[-\. \)]*\d{3}[-\. ]?\d{4}\b")

    위의 정규식은 몇 가지를 반환할 수 있습니다. 123) 456 7899 또는 (123 456 7899와 같은 가양성 결과. 아래 버전은 이러한 문제를 해결합니다. 그러나 이 구문은 VBA RegExp 함수에서만 작동하며 일반 정규식에서는 작동하지 않습니다.

    패턴 : (\(\d{3}\)두 문자 사이의 텍스트를 추출하기 위한 out은 두 문자열 사이의 텍스트를 추출하는 데에도 작동합니다.

    예를 들어 "test 1"과 "test 2" 사이의 모든 항목을 가져오려면 다음 정규식을 사용하세요.

    패턴 : 테스트 1(.*?)테스트 2

    완전한 공식은 다음과 같습니다.

    =AblebitsRegexExtract(A5, "test 1(.*?)test 2")

    URL에서 도메인을 추출하는 정규식

    정규식을 사용하더라도 URL에서 도메인 이름을 추출하는 것은 쉬운 일이 아닙니다. 트릭을 수행하는 핵심 요소는 비캡처 그룹입니다. 궁극적인 목표에 따라 아래 정규 표현식 중 하나를 선택하세요.

    하위 도메인

    패턴 을 포함한 전체 도메인 이름 을 얻으려면: (?: https?\:

    Michael Brown은 소프트웨어 도구를 사용하여 복잡한 프로세스를 단순화하려는 열정을 가진 열성적인 기술 애호가입니다. 기술 산업에서 10년 이상의 경험을 쌓은 그는 Microsoft Excel 및 Outlook은 물론 Google 스프레드시트 및 문서 도구에 대한 기술을 연마했습니다. Michael의 블로그는 자신의 지식과 전문 지식을 다른 사람과 공유하는 데 전념하며 따라하기 쉬운 팁과 생산성 및 효율성 향상을 위한 자습서를 제공합니다. 노련한 전문가이든 초보자이든 Michael의 블로그는 이러한 필수 소프트웨어 도구를 최대한 활용하기 위한 귀중한 통찰력과 실용적인 조언을 제공합니다.