셀 내 및 루프 모두에서 Microsoft Excel에서 정규식 (Regex)을 사용하는 방법


592

Excel에서 정규식을 사용하고 데이터 조작을 위해 Excel의 강력한 그리드와 같은 설정을 활용하려면 어떻게해야합니까?

  • 일치하는 패턴 또는 대체 된 값을 문자열로 반환하는 셀 내 함수입니다.
  • Sub는 데이터 열을 반복하고 인접한 셀에 일치하는 항목을 추출합니다.
  • 어떤 설정이 필요합니까?
  • 정규식에 대한 Excel의 특수 문자는 무엇입니까?

내가 정규식이 많은 상황 (적합하지 않습니다 이해 사용하거나하지 정규 표현식을 사용하는? ) 엑셀 사용할 수 있기 때문에 Left, Mid, Right, Instr유사한 조작에 대한 유형 명령.


11
Patrick Matthews가
작성한

1
:이 무료 추가 시도 seotoolsforexcel.com/regexpfind
닐스 Bosma

1
regex 스타일 기능의 가벼운 버전을 제공하는 Like operator를 잊지 마십시오 . 하위 또는 함수 프로 시저에 싸여 있어도 일반적으로 정규식보다 훨씬 빠릅니다.
Egalth

답변:


955

정규식 은 패턴 일치에 사용됩니다.

Excel에서 사용하려면 다음 단계를 수행하십시오.

1 단계 : "Microsoft VBScript 정규식 5.5"에 VBA 참조 추가

  • "개발자"탭을 선택하십시오 ( 이 탭이 없으면 어떻게해야합니까? )
  • '코드'리본 섹션에서 "Visual Basic"아이콘을 선택하십시오.
  • "Microsoft Visual Basic for Applications"창의 상단 메뉴에서 "도구"를 선택하십시오.
  • "참조"를 선택하십시오
  • 통합 문서에 포함 시키려면 "Microsoft VBScript Regular Expressions 5.5"옆의 확인란을 선택하십시오.
  • "확인"을 클릭하십시오

2 단계 : 패턴 정의

기본 정의 :

- 범위.

  • 예를 들어 a-za에서 z까지의 소문자와 일치
  • 예 : 0-50에서 5까지의 숫자와 일치

[] 이 괄호 안의 객체 중 하나와 정확히 일치하십시오.

  • [a]를 들어 문자 a와 일치
  • 예 : [abc]a, b 또는 c 일 수있는 단일 문자와 일치
  • [a-z]를 들어 알파벳의 소문자 하나와 일치합니다.

()반품 목적으로 다른 경기를 그룹화합니다. 아래 예를 참조하십시오.

{} 이전에 정의 된 패턴의 반복 사본에 대한 승수입니다.

  • 예를 들어 [a]{2}두 개의 연속 된 소문자 a와 일치합니다.aa
  • 예는 [a]{1,3}적어도 하나의 최대 세 개의 소문자와 일치 a, aa,aaa

+ 이전에 정의 된 패턴 중 하나 이상을 일치시킵니다.

  • 예는 a+일치 연속 A의 a, aa, aaa, 등

? 이전에 정의 된 패턴 중 하나 또는 하나를 일치시킵니다.

  • 예를 들어 패턴은 존재하거나 존재하지 않을 수 있지만 한 번만 일치 될 수 있습니다.
  • 예를 들어 [a-z]?빈 문자열이나 소문자 하나와 일치합니다.

* 이전에 정의 된 패턴 중 0 개 이상을 일치시킵니다. -존재하거나 존재하지 않을 수있는 패턴을위한 와일드 카드. -예 : [a-z]*빈 문자열 또는 소문자 문자열과 일치합니다.

. 개행을 제외한 모든 문자와 일치 \n

  • 예 : a.a로 시작하고 다음을 제외한 모든 것으로 끝나는 두 문자열을 찾습니다.\n

| OR 연산자

  • 예를 들어 또는 일치 할 수 있음을 a|b의미합니다 .ab
  • red|white|orange를 들어 색상 중 하나와 정확히 일치합니다.

^ NOT 연산자

  • 예를 들어 [^0-9]문자는 숫자를 포함 할 수 없습니다
  • 예를 들어 [^aA]문자는 소문자 a또는 대문자 일 수 없습니다A

\ 뒤에 나오는 특수 문자를 이스케이프 처리합니다 (위의 동작을 무시 함)

  • \., \\, \(, \?, \$,\^

고정 패턴 :

^ 문자열 시작시 일치해야합니다

  • 예 : ^a첫 문자는 소문자 여야합니다a
  • 예를 들어 ^[0-9]첫 문자는 숫자 여야합니다.

$ 문자열 끝에서 일치해야합니다.

  • 예 : a$마지막 문자는 소문자 여야합니다a

우선 순위 테이블 :

Order  Name                Representation
1      Parentheses         ( )
2      Multipliers         ? + * {m,n} {m, n}?
3      Sequence & Anchors  abc ^ $
4      Alternation         |

사전 정의 된 문자 약어 :

abr    same as       meaning
\d     [0-9]         Any single digit
\D     [^0-9]        Any single character that's not a digit
\w     [a-zA-Z0-9_]  Any word character
\W     [^a-zA-Z0-9_] Any non-word character
\s     [ \r\t\n\f]   Any space character
\S     [^ \r\t\n\f]  Any non-space character
\n     [\n]          New line

예 1 : 매크로로 실행

다음 예제 매크로는 셀의 값 A1을보고 처음 1 또는 2 문자가 숫자인지 확인합니다. 그렇다면 제거되고 나머지 문자열이 표시됩니다. 그렇지 않은 경우 일치하는 항목이 없다는 내용의 상자가 나타납니다. 숫자가 문자열의 시작 부분에 없었기 때문에 셀 A112abc은 return abc, 값 1abc은 return abc, abc123"Not Matched"를 반환합니다.

Private Sub simpleRegex()
    Dim strPattern As String: strPattern = "^[0-9]{1,2}"
    Dim strReplace As String: strReplace = ""
    Dim regEx As New RegExp
    Dim strInput As String
    Dim Myrange As Range

    Set Myrange = ActiveSheet.Range("A1")

    If strPattern <> "" Then
        strInput = Myrange.Value

        With regEx
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = strPattern
        End With

        If regEx.Test(strInput) Then
            MsgBox (regEx.Replace(strInput, strReplace))
        Else
            MsgBox ("Not matched")
        End If
    End If
End Sub

예 2 : 셀 내 함수로 실행

이 예는 예 1과 동일하지만 셀 내 기능으로 실행되도록 설정되어 있습니다. 사용하려면 코드를 다음과 같이 변경하십시오.

Function simpleCellRegex(Myrange As Range) As String
    Dim regEx As New RegExp
    Dim strPattern As String
    Dim strInput As String
    Dim strReplace As String
    Dim strOutput As String


    strPattern = "^[0-9]{1,3}"

    If strPattern <> "" Then
        strInput = Myrange.Value
        strReplace = ""

        With regEx
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = strPattern
        End With

        If regEx.test(strInput) Then
            simpleCellRegex = regEx.Replace(strInput, strReplace)
        Else
            simpleCellRegex = "Not matched"
        End If
    End If
End Function

cell에 문자열 ( "12abc")을 배치하십시오 A1. 이 수식 =simpleCellRegex(A1)을 셀에 입력 B1하면 결과는 "abc"가됩니다.

결과 이미지


예 3 : 루프 스루 범위

이 예제는 예제 1과 동일하지만 셀 범위를 반복합니다.

Private Sub simpleRegex()
    Dim strPattern As String: strPattern = "^[0-9]{1,2}"
    Dim strReplace As String: strReplace = ""
    Dim regEx As New RegExp
    Dim strInput As String
    Dim Myrange As Range

    Set Myrange = ActiveSheet.Range("A1:A5")

    For Each cell In Myrange
        If strPattern <> "" Then
            strInput = cell.Value

            With regEx
                .Global = True
                .MultiLine = True
                .IgnoreCase = False
                .Pattern = strPattern
            End With

            If regEx.Test(strInput) Then
                MsgBox (regEx.Replace(strInput, strReplace))
            Else
                MsgBox ("Not matched")
            End If
        End If
    Next
End Sub

예 4 : 다른 패턴을 분리

이 예제는 범위 ( A1, A2& A3) 를 반복 하며 3 자리 숫자로 시작하고 단일 알파벳 문자와 4 자리 숫자로 이루어진 문자열을 찾습니다. 출력은를 사용하여 패턴 일치를 인접한 셀로 분리합니다 (). $1의 첫 번째 세트 내에서 일치하는 첫 번째 패턴을 나타냅니다 ().

Private Sub splitUpRegexPattern()
    Dim regEx As New RegExp
    Dim strPattern As String
    Dim strInput As String
    Dim Myrange As Range

    Set Myrange = ActiveSheet.Range("A1:A3")

    For Each C In Myrange
        strPattern = "(^[0-9]{3})([a-zA-Z])([0-9]{4})"

        If strPattern <> "" Then
            strInput = C.Value

            With regEx
                .Global = True
                .MultiLine = True
                .IgnoreCase = False
                .Pattern = strPattern
            End With

            If regEx.test(strInput) Then
                C.Offset(0, 1) = regEx.Replace(strInput, "$1")
                C.Offset(0, 2) = regEx.Replace(strInput, "$2")
                C.Offset(0, 3) = regEx.Replace(strInput, "$3")
            Else
                C.Offset(0, 1) = "(Not matched)"
            End If
        End If
    Next
End Sub

결과 :

결과 이미지


추가 패턴 예

String   Regex Pattern                  Explanation
a1aaa    [a-zA-Z][0-9][a-zA-Z]{3}       Single alpha, single digit, three alpha characters
a1aaa    [a-zA-Z]?[0-9][a-zA-Z]{3}      May or may not have preceding alpha character
a1aaa    [a-zA-Z][0-9][a-zA-Z]{0,3}     Single alpha, single digit, 0 to 3 alpha characters
a1aaa    [a-zA-Z][0-9][a-zA-Z]*         Single alpha, single digit, followed by any number of alpha characters

</i8>    \<\/[a-zA-Z][0-9]\>            Exact non-word character except any single alpha followed by any single digit

22
잊지 말아야합니다 Set regEx = Nothing. Sub가 자주 실행될 때 메모리 부족 예외가 발생합니다.
Kiril

1
더 복잡한 정규 표현식을 처리하기 위해 SubMatches 를 사용하여 예제 4를 수정 했습니다. 기본적으로 누군가 관심이 있다면 분할 할 때 바꾸기를 사용하지 않습니다. stackoverflow.com/questions/30218413/…
Armfoot

11
늦은 바인딩 라인 :Set regEx = CreateObject("VBScript.RegExp")
ZygD

2
좋아, 코드가에 있기 때문에 확실합니다 ThisWorkbook. 코드를 별도로 이동해보십시오 Module.
포틀랜드 러너

3
"프로젝트 탐색기"(?)의 @PortlandRunner에는이 파일에 "모듈"하위 폴더가 없지만 다른 파일에는 하나가 있습니다. 파일을 마우스 오른쪽 버튼으로 클릭하고 '모듈 삽입'을 선택한 다음 "모듈 1"을 두 번 클릭하고 코드를 붙여 넣습니다. 저장되었습니다. 통합 문서로 돌아가서 기능을 다시 입력했습니다. 나처럼 미숙 한 사람을 위해 대답에 주목할 수 있습니까? 도와 주셔서 감사합니다.
youcantryreachingme

205

Excel 수식에서 직접 정규식을 사용하려면 다음 UDF (사용자 정의 함수)가 도움이 될 수 있습니다. 그것은 정규 표현식 기능을 엑셀 함수로 거의 직접적으로 노출시킵니다.

작동 원리

2-3 개의 매개 변수가 필요합니다.

  1. 정규식을 사용할 텍스트입니다.
  2. 정규식.
  3. 결과의 모양을 지정하는 형식 문자열입니다. $0,, $1등을 포함 할 수 있습니다 $2. $0는 전체 일치 $1이며 up은 정규식의 각 일치 그룹에 해당합니다. 기본값은 $0입니다.

몇 가지 예

이메일 주소 추출하기 :

=regex("Peter Gordon: some@email.com, 47", "\w+@\w+\.\w+")
=regex("Peter Gordon: some@email.com, 47", "\w+@\w+\.\w+", "$0")

결과 : some@email.com

여러 부분 문자열 추출하기 :

=regex("Peter Gordon: some@email.com, 47", "^(.+): (.+), (\d+)$", "E-Mail: $2, Name: $1")

결과 : E-Mail: some@email.com, Name: Peter Gordon

단일 셀의 결합 된 문자열을 여러 셀의 구성 요소로 분리하려면 다음을 수행하십시오.

=regex("Peter Gordon: some@email.com, 47", "^(.+): (.+), (\d+)$", "$" & 1)
=regex("Peter Gordon: some@email.com, 47", "^(.+): (.+), (\d+)$", "$" & 2)

결과 : Peter Gordon some@email.com...

사용하는 방법

이 UDF를 사용하려면 다음을 수행하십시오 (대략 이 Microsoft 페이지를 기반으로 합니다 . 추가 정보가 있습니다).

  1. Excel에서 매크로 사용 파일 ( '.xlsm')로 밀어서 Microsoft Visual Basic for Applications Editor ALT+F11를 엽니 다 .
  2. 정규식 라이브러리에 VBA 참조를 추가하십시오 ( Portland Runners ++ answer 에서 뻔뻔스럽게 복사 됨 ).
    1. 도구 -> 참조를 클릭하십시오 (독일 스크린 샷을 실례하십시오) 도구-> 참조
    2. 목록에서 Microsoft VBScript Regular Expressions 5.5 를 찾아 옆에있는 확인란을 선택하십시오.
    3. 확인을 클릭하십시오 .
  3. 모듈 삽입을 클릭하십시오 . 모듈에 다른 이름을 지정하면 모듈의 이름이 아래 UDF와 동일 하지 않아야 합니다 (예 : 모듈 이름 지정 Regex및 기능으로 regex인해 #NAME! 오류가 발생 함).

    아이콘 행의 두 번째 아이콘-> 모듈

  4. 가운데의 큰 텍스트 창에 다음을 삽입하십시오.

    Function regex(strInput As String, matchPattern As String, Optional ByVal outputPattern As String = "$0") As Variant
        Dim inputRegexObj As New VBScript_RegExp_55.RegExp, outputRegexObj As New VBScript_RegExp_55.RegExp, outReplaceRegexObj As New VBScript_RegExp_55.RegExp
        Dim inputMatches As Object, replaceMatches As Object, replaceMatch As Object
        Dim replaceNumber As Integer
    
        With inputRegexObj
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = matchPattern
        End With
        With outputRegexObj
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = "\$(\d+)"
        End With
        With outReplaceRegexObj
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
        End With
    
        Set inputMatches = inputRegexObj.Execute(strInput)
        If inputMatches.Count = 0 Then
            regex = False
        Else
            Set replaceMatches = outputRegexObj.Execute(outputPattern)
            For Each replaceMatch In replaceMatches
                replaceNumber = replaceMatch.SubMatches(0)
                outReplaceRegexObj.Pattern = "\$" & replaceNumber
    
                If replaceNumber = 0 Then
                    outputPattern = outReplaceRegexObj.Replace(outputPattern, inputMatches(0).Value)
                Else
                    If replaceNumber > inputMatches(0).SubMatches.Count Then
                        'regex = "A to high $ tag found. Largest allowed is $" & inputMatches(0).SubMatches.Count & "."
                        regex = CVErr(xlErrValue)
                        Exit Function
                    Else
                        outputPattern = outReplaceRegexObj.Replace(outputPattern, inputMatches(0).SubMatches(replaceNumber - 1))
                    End If
                End If
            Next
            regex = outputPattern
        End If
    End Function
  5. Microsoft Visual Basic for Applications Editor 창 저장하고 닫습니다 .


6
이 답변은 여기 에 추가 기능을 만들기위한 단계와 결합 되어 매우 도움이되었습니다. 감사합니다. 모듈과 기능에 동일한 이름을 지정하지 마십시오!
Chris Hunt

2
Chris Hunt의 위의 의견을 반복하십시오. 모듈 'Regex'도 호출하지 마십시오. #NAME 오류로 인해 기능이 작동하지 않아서 한동안 화가 났다고 생각했습니다.
Chris

글쎄, 나는 모듈 / 이름 변경을 포함한 모든 것을 시도했지만 여전히 #NAME 오류> _> i.imgur.com/UUQ6eCi.png
Enissay

@Enissay : 최소 Function foo() As Variant \n foo="Hello World" \n End FunctionUDF를 작성하여 작동하는지 확인하십시오. 그렇다면 기본 사항이 깨지지 않은 경우 (매크로 비활성화?) 위의 모든 작업을 수행하십시오.
Patrick Böker


64

서두르는 사람들을 위해 patszim답변 을 확장하십시오 .

  1. Excel 통합 문서를 엽니 다.
  2. Alt+ F11VBA / 매크로 창을 열려면
  3. 아래 정규식에 대한 참조를 추가 도구 다음 참조
    ! [엑셀 VBA 양식 참조 추가
  4. Microsoft VBScript Regular Expression 5.5 선택
    ! [Excel VBA 정규 표현식 참조 추가
  5. 새 모듈을 삽입하십시오 (코드는 모듈에 상주해야하며 그렇지 않으면 작동하지 않습니다).
    ! [Excel VBA 삽입 코드 모듈
  6. 새로 삽입 된 모듈에서
    ! [Excel VBA 코드를 모듈에 삽입
  7. 다음 코드를 추가하십시오.

    Function RegxFunc(strInput As String, regexPattern As String) As String
        Dim regEx As New RegExp
        With regEx
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .pattern = regexPattern
        End With
    
        If regEx.Test(strInput) Then
            Set matches = regEx.Execute(strInput)
            RegxFunc = matches(0).Value
        Else
            RegxFunc = "not matched"
        End If
    End Function
  8. 정규식 패턴은 셀 중 하나에 배치되고 절대 참조 가 사용됩니다. ! [엑셀 정규식 기능 셀 사용 함수는 만든 통합 문서에 연결됩니다.
    다른 통합 문서에서 사용해야하는 경우 Personal.XLSB에 함수를 저장하십시오.


1
작업중인 모든 Excel 문서에서 사용할 수 있으려면 Personal.xlsb에 있어야합니다. 대부분의 (?) 다른 답변은 그것을 명확하게하지 않습니다. Personal.XLSB는 폴더로 이동합니다 (폴더를 작성해야 할 수도 있음) C : \ Users \ user name \ AppData \ Local \ Microsoft \ Excel \ XLStart 폴더
Mark Stewart

26

내 시도는 다음과 같습니다.

Function RegParse(ByVal pattern As String, ByVal html As String)
    Dim regex   As RegExp
    Set regex = New RegExp

    With regex
        .IgnoreCase = True  'ignoring cases while regex engine performs the search.
        .pattern = pattern  'declaring regex pattern.
        .Global = False     'restricting regex to find only first match.

        If .Test(html) Then         'Testing if the pattern matches or not
            mStr = .Execute(html)(0)        '.Execute(html)(0) will provide the String which matches with Regex
            RegParse = .Replace(mStr, "$1") '.Replace function will replace the String with whatever is in the first set of braces - $1.
        Else
            RegParse = "#N/A"
        End If

    End With
End Function

9

이것을 셀 함수 ( SUM또는 같은 VLOOKUP) 로 사용해야하고 다음과 같은 것이 쉽다는 것을 알았습니다.

  1. 매크로 사용 Excel 파일 (xlsm로 저장)에 있는지 확인하십시오.
  2. 개발자 도구 열기 Alt+F11
  3. 다른 답변과 마찬가지로 Microsoft VBScript Regular Expressions 5.5 추가
  4. 통합 문서 또는 자체 모듈에서 다음 함수를 작성하십시오.

    Function REGPLACE(myRange As Range, matchPattern As String, outputPattern As String) As Variant
        Dim regex As New VBScript_RegExp_55.RegExp
        Dim strInput As String
    
        strInput = myRange.Value
    
        With regex
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = matchPattern
        End With
    
        REGPLACE = regex.Replace(strInput, outputPattern)
    
    End Function
  5. 그런 다음 셀에서 사용할 수 있습니다 =REGPLACE(B1, "(\w) (\d+)", "$1$2")(예 : "A 243"- "A243")


outputPattern의이 이름은 나를 버렸습니다. 대체 값입니다.
Thor

1
예. 이름이 pattern이라는 패턴을 남겨두면 문자열 대체 만이 아니라 $ 1 $ 2와 같은 정규식 일치 그룹을 사용할 수 있습니다.
DeezCashews

7

이것은 직접적인 대답은 아니지만 고려할 때보다 효율적인 대안을 제공 할 수 있습니다. 즉, Google 스프레드 시트에는 여러 정규식 함수가 내장되어 있어 매우 편리하며 Excel의 일부 기술적 절차를 우회하는 데 도움이됩니다. 분명히 PC에서 Excel을 사용하면 몇 가지 장점이 있지만 대부분의 사용자에게 Google 스프레드 시트는 동일한 경험을 제공하며 이식성과 문서 공유에 몇 가지 이점을 제공 할 수 있습니다.

그들은 제안한다

REGEXEXTRACT : 정규식에 따라 일치하는 하위 문자열을 추출합니다.

REGEXREPLACE : 정규식을 사용하여 텍스트 문자열의 일부를 다른 텍스트 문자열로 바꿉니다.

대체 : 기존 텍스트를 문자열의 새 텍스트로 바꿉니다.

REPLACE : 텍스트 문자열의 일부를 다른 텍스트 문자열로 바꿉니다.

셀에 직접 입력하여 원하는 것을 만들 수 있습니다

=REGEXMATCH(A2, "[0-9]+")

또한 IF 문과 같은 다른 기능과의 조합으로도 잘 작동합니다 .

=IF(REGEXMATCH(E8,"MiB"),REGEXEXTRACT(E8,"\d*\.\d*|\d*")/1000,IF(REGEXMATCH(E8,"GiB"),REGEXEXTRACT(E8,"\d*\.\d*|\d*"),"")

여기에 이미지 설명을 입력하십시오

잘하면 이것은 Excel의 VBS 구성 요소에 의해 도발 된 사용자에게 간단한 해결 방법을 제공하기를 바랍니다.


Alex를 공유해 주셔서 감사합니다. Google 버전을 찾는 사람들에게 유용합니다. Google 스프레드 시트 정규식에는 고유 한 명명법이 있으므로 다른 질문에 매우 유용한 다른 질문을 작성하고 답변하는 것을 고려할 수 있습니다. 어쨌든, 당신은 내 공감대를 가지고 있습니다!
포틀랜드 러너

4

여기 regex_subst()함수가 있습니다. 예 :

=regex_subst("watermellon", "[aeiou]", "")
---> wtrmlln
=regex_subst("watermellon", "[^aeiou]", "")
---> aeeo

다음은 단순화 된 코드입니다 (어쨌든 나를 위해 더 간단합니다). 위의 예제를 사용하여 적절한 출력 패턴을 작성하는 방법을 알 수 없었습니다.

Function regex_subst( _
     strInput As String _
   , matchPattern As String _
   , Optional ByVal replacePattern As String = "" _
) As Variant
    Dim inputRegexObj As New VBScript_RegExp_55.RegExp

    With inputRegexObj
        .Global = True
        .MultiLine = True
        .IgnoreCase = False
        .Pattern = matchPattern
    End With

    regex_subst = inputRegexObj.Replace(strInput, replacePattern)
End Function

1

스크립트를 이식 가능해야하기 때문에 참조 라이브러리를 활성화하고 싶지 않습니다. Dim foo As New VBScript_RegExp_55.RegExp라인은 발생User Defined Type Not Defined 오류,하지만 난 나를 위해 일한 해결책을 발견했다.

당신이하고 싶은 것은 셀에 예제 문자열을 A1넣은 다음을 테스트하는 것 strPattern입니다. 작동하면 rng원하는대로 조정하십시오 .

Public Sub RegExSearch()
'/programming/22542834/how-to-use-regular-expressions-regex-in-microsoft-excel-both-in-cell-and-loops
'https://wellsr.com/vba/2018/excel/vba-regex-regular-expressions-guide/
'https://www.vitoshacademy.com/vba-regex-in-excel/
    Dim regexp As Object
    'Dim regex As New VBScript_RegExp_55.regexp 'Caused "User Defined Type Not Defined" Error
    Dim rng As Range, rcell As Range
    Dim strInput As String, strPattern As String

    Set regexp = CreateObject("vbscript.regexp")
    Set rng = ActiveSheet.Range("A1:A1")

    strPattern = "([a-z]{2})([0-9]{8})"
    'Search for 2 Letters then 8 Digits Eg: XY12345678 = Matched

    With regexp
        .Global = False
        .MultiLine = False
        .ignoreCase = True
        .Pattern = strPattern
    End With

    For Each rcell In rng.Cells

        If strPattern <> "" Then
            strInput = rcell.Value

            If regexp.test(strInput) Then
                MsgBox rcell & " Matched in Cell " & rcell.Address
            Else
                MsgBox "No Matches!"
            End If
        End If
    Next
End Sub

스크립트를 이식 할 수 있어야하기 때문에 참조 라이브러리를 활성화하고 싶지는 않습니다 . VBScript_RegExp_55라이브러리는 거의 어디에나 있으므로 특정 대상 컴퓨터에 있지 않을 위험이 매우 낮습니다. 어쨌든 Early Bound에서 Late Bound로 전환해도 이식성 문제는 해결되지 않습니다 (코드는 여전히 컴파일 타임이 아닌 런타임에만 오류가 발생 함)
chris neilsen

1
아니요, 전혀 사실이 아닙니다.이 스크립트는 이식 가능한 것을 활성화하지 않고도 다른 사용자와 공유 할 수 있습니다. 감사합니다
FreeSoftwareServers

1
물론 RegEx 코드는 사용할 수 없습니다 . RegEx 자료가 더 큰 라이브러리 통합 문서의 일부인 경우 컴파일 오류가 발생하지 않으므로 다른 부분을 사용할 수있게하는 것이 유용한 것으로 간주 될 수 있습니다.
chris neilsen at

1

귀중한 컨텐츠에 추가하기 위해 때때로 VBA 내의 RegEx가 이상적이지 않은 이유에 대해이 알림을 작성하고 싶습니다. 모든 표현이 지원되는 것은 아니지만 대신에을 던지고 Error 5017저자가 추측하도록 내버려 둘 수도 있습니다 (저는 본인의 희생자입니다).

우리는 몇 가지 찾을 수 있습니다 동안 소스 것에 있다 지원을, 그것은 helpfull이되는 등 메타 알 것 없습니다 지원. 보다 자세한 설명은 여기를 참조하십시오 . 이 출처에서 언급 :

"VBScript의 정규 표현식 ... 버전 5.5는 이전 버전의 VBScript에는 없었던 필수 정규 표현식 기능을 구현합니다. ... JavaScript 및 VBScript는 Perl 스타일 정규식을 구현합니다. 그러나 Perl과 다른 현대적인 정규 표현식에서 사용할 수있는 많은 고급 기능이 부족합니다. "


따라서 지원 되지 않습니다 :

  • String ancor의 시작 \A, 또는 ^캐럿을 사용하여 문자열의 첫 번째 문자 앞에 위치를 일치 시킵니다.
  • 문자열 끝 ancor \Z, 또는 $문자열의 마지막 문자 다음에 달러 기호를 사용하여 위치를 일치 시킵니다.
  • 긍정적 인 LookBehind (예 : Postive (?<=a)bLookAhead 지원되는 동안 )
  • 부정적 LookBehind (예 : (?<!a)b부정적 LookAhead 지원되는 동안 )
  • 원자 그룹화
  • 소유 수량 자
  • 유니 코드 예 : \{uFFFF}
  • 명명 된 캡처 그룹 . 또는 번호가 매겨진 캡처 그룹 사용
  • 인라인 수정 자 (예 : /i(대소 문자 구분) 또는 /g(글로벌) 등) RegExp객체 속성을 통해 설정 RegExp.Global = True하고 RegExp.IgnoreCase = True가능한 경우이를 설정합니다.
  • 조건부
  • 정규 표현식 설명 . '스크립트에서 정기적 인 주석으로 추가

VBA에서 정규 표현식을 사용하여 이미 두 번 이상 벽에 부딪 쳤습니다. 보통은 LookBehind있지만 때로는 수정자를 잊어 버립니다. 위의 모든 배경을 직접 경험하지는 못했지만 좀 더 자세한 정보를 광범위하게 참조하려고 노력했습니다. 의견 / 수정 / 추가를 자유롭게하십시오. 많은 정보를 얻으 려면 regular-expressions.info 에 큰 소리를 지르십시오 .

추신 당신은 정기적 인 VBA 방법과 기능을 언급했으며 RegEx가 실패 할 때 그들 자신의 방식으로 (적어도 나 자신에게) 도움이되었다는 것을 확인할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.