Cách sử dụng Biểu thức chính quy (Regex) trong Microsoft Excel cả trong ô và vòng lặp


592

Làm cách nào tôi có thể sử dụng các biểu thức thông thường trong Excel và tận dụng thiết lập giống như lưới mạnh mẽ của Excel để thao tác dữ liệu?

  • Hàm trong ô để trả về một mẫu phù hợp hoặc giá trị được thay thế trong một chuỗi.
  • Sub để lặp qua một cột dữ liệu và trích xuất khớp với các ô liền kề.
  • Thiết lập nào là cần thiết?
  • Các ký tự đặc biệt của Excel cho các biểu thức chính quy là gì?

Tôi hiểu Regex là không lý tưởng cho nhiều tình huống ( Để sử dụng hoặc không sử dụng biểu thức thông thường? ) Kể từ excel có thể sử dụng Left, Mid, Right, Instrloại lệnh cho các thao tác tương tự.


11
Tôi đặc biệt giới thiệu bài viết
Regrec

1
Hãy dùng thử bổ trợ miễn phí này: seotoolsforexcel.com/regExfind
Niels Bosma

1
Chúng ta đừng quên Like toán tử , cung cấp một loại phiên bản nhẹ của chức năng kiểu regex. Nó thường nhanh hơn nhiều so với regex, ngay cả khi được bao bọc trong một thủ tục phụ hoặc hàm.
Egalth

Câu trả lời:


955

Biểu thức chính quy được sử dụng cho Kết hợp mẫu.

Để sử dụng trong Excel, hãy làm theo các bước sau:

Bước 1 : Thêm tham chiếu VBA vào "Biểu thức chính quy Microsoft VBScript 5.5"

  • Chọn tab "Nhà phát triển" ( Tôi không có tab này, tôi phải làm gì? )
  • Chọn biểu tượng "Visual Basic" từ phần ruy băng 'Code'
  • Trong cửa sổ "Microsoft Visual Basic for Application", chọn "Công cụ" từ menu trên cùng.
  • Chọn "Tài liệu tham khảo"
  • Chọn hộp bên cạnh "Microsoft VBScript Biểu thức chính quy 5.5" để đưa vào sổ làm việc của bạn.
  • Nhấp vào "OK"

Bước 2 : Xác định mẫu của bạn

Định nghĩa cơ bản:

- Phạm vi.

  • Ví dụ: a-zkhớp với một chữ cái viết thường từ a đến z
  • Ví dụ: 0-5khớp với bất kỳ số nào từ 0 đến 5

[] Khớp chính xác một trong các đối tượng bên trong các dấu ngoặc này.

  • Ví dụ: [a]khớp với chữ a
  • Ví dụ: [abc]khớp với một chữ cái có thể là a, b hoặc c
  • Ví dụ, [a-z]phù hợp với bất kỳ chữ cái viết thường của bảng chữ cái.

()Nhóm phù hợp khác nhau cho mục đích trở lại. Xem ví dụ dưới đây.

{} Số nhân cho các bản sao lặp lại của mẫu được xác định trước nó.

  • Ví dụ: [a]{2}khớp hai chữ cái viết thường liên tiếp a:aa
  • Ví dụ [a]{1,3}phù hợp với ít nhất một và tối đa ba thấp hơn thư trường hợp a, aa,aaa

+ Khớp ít nhất một hoặc nhiều mẫu của mẫu được xác định trước mẫu đó.

  • Ví dụ như a+sẽ phù hợp liên tiếp của một a, aa, aaa, và vân vân

? Khớp 0 hoặc một trong các mẫu được xác định trước nó.

  • Ví dụ: Mẫu có thể có hoặc không có nhưng chỉ có thể được khớp một lần.
  • Ví dụ, [a-z]?khớp với chuỗi rỗng hoặc bất kỳ chữ cái viết thường nào.

* Khớp 0 hoặc nhiều mẫu được xác định trước nó. - Ví dụ: Wildcard cho mẫu có thể có hoặc không có. - Ví dụ: [a-z]*khớp với chuỗi rỗng hoặc chuỗi ký tự viết thường.

. Phù hợp với bất kỳ nhân vật nào ngoại trừ dòng mới \n

  • Ví dụ: Ghép a.chuỗi hai ký tự bắt đầu bằng a và kết thúc bằng bất cứ thứ gì ngoại trừ\n

| Toán tử OR

  • Ví dụ, a|bcó nghĩa là ahoặc bcó thể được khớp.
  • Ví dụ, red|white|orangekết hợp chính xác một trong các màu.

^ Nhà điều hành KHÔNG

  • Ví dụ: [^0-9]ký tự không thể chứa số
  • Ví dụ: [^aA]ký tự không thể là chữ thường ahoặc chữ hoaA

\ Thoát khỏi ký tự đặc biệt theo sau (ghi đè hành vi trên)

  • Ví dụ như \., \\, \(, \?, \$,\^

Các mẫu neo:

^ Trận đấu phải xảy ra khi bắt đầu chuỗi

  • Ví dụ: ^aký tự đầu tiên phải là chữ thườnga
  • Ví dụ: ^[0-9]Ký tự đầu tiên phải là một số.

$ Trận đấu phải diễn ra ở cuối chuỗi

  • Ví dụ: a$Ký tự cuối cùng phải là chữ thườnga

Bảng ưu tiên:

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

Chữ viết tắt được xác định trước:

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

Ví dụ 1 : Chạy dưới dạng macro

Macro ví dụ sau đây nhìn vào giá trị trong ô A1để xem nếu 1 hoặc 2 ký tự đầu tiên là chữ số. Nếu vậy, chúng được loại bỏ và phần còn lại của chuỗi được hiển thị. Nếu không, sau đó một hộp xuất hiện cho bạn biết rằng không tìm thấy kết quả khớp. Cell A1giá trị của 12abcsẽ trở lại abc, giá trị 1abcsẽ trở lại abc, giá trị abc123sẽ trở lại "Không khớp" bởi vì các chữ số không phải là lúc bắt đầu của chuỗi.

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

Ví dụ 2 : Chạy dưới dạng hàm trong ô

Ví dụ này giống như ví dụ 1 nhưng được thiết lập để chạy như một hàm trong ô. Để sử dụng, thay đổi mã thành này:

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

Đặt chuỗi của bạn ("12abc") trong ô A1. Nhập công thức này =simpleCellRegex(A1)vào ô B1và kết quả sẽ là "abc".

kết quả hình ảnh


Ví dụ 3 : Lặp lại phạm vi

Ví dụ này giống như ví dụ 1 nhưng vòng lặp thông qua một phạm vi ô.

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

Ví dụ 4 : Tách các mẫu khác nhau

Ví dụ này lặp qua một phạm vi ( A1, A2& A3) và tìm kiếm một chuỗi bắt đầu bằng ba chữ số theo sau là một ký tự alpha và sau đó là 4 chữ số. Đầu ra phân tách mô hình khớp với các ô liền kề bằng cách sử dụng (). $1đại diện cho mẫu đầu tiên phù hợp trong tập đầu tiên của ().

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

Các kết quả:

kết quả hình ảnh


Ví dụ mẫu bổ sung

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
Bạn không nên quên Set regEx = Nothing. Bạn sẽ nhận được các ngoại lệ Out Of Memory, khi Sub đó được thực thi thường xuyên đủ.
Kiril

1
Tôi thích nghi dụ 4 với SubMatches để điều trị regex phức tạp hơn, về cơ bản tôi không sử dụng thay thế khi tách, nếu có ai quan tâm: stackoverflow.com/questions/30218413/...
Armfoot

11
Dòng ràng buộc muộn:Set regEx = CreateObject("VBScript.RegExp")
ZygD

2
Được rồi, tôi khá chắc chắn đó là vì mã đang ở trong ThisWorkbook. Hãy thử di chuyển mã riêng biệt Module.
Á quân Portland

3
@PortlandRunner trong "dự án thám hiểm" (?) Tệp excel này thiếu thư mục con "Mô-đun", mặc dù một tệp khác hiển thị. Nhấp chuột phải vào tệp và chọn 'chèn mô-đun', sau đó nhấp đúp vào "Mô-đun 1" và dán mã. Đã lưu. Quay lại sổ làm việc và nhập lại chức năng - nó đã hoạt động. Có thể đáng chú ý trong câu trả lời, vì lợi ích của những người thiếu kinh nghiệm như tôi? Cảm ơn đã giúp đỡ.
youcantryreachingme

205

Để sử dụng các biểu thức chính quy trực tiếp trong các công thức Excel, UDF (hàm do người dùng xác định) sau đây có thể giúp ích. Nó ít nhiều trực tiếp phơi bày chức năng biểu thức chính quy như một hàm excel.

Làm thế nào nó hoạt động

Phải mất 2-3 tham số.

  1. Một văn bản để sử dụng các biểu thức thông thường trên.
  2. Một biểu thức chính quy.
  3. Một chuỗi định dạng chỉ định kết quả sẽ trông như thế nào. Nó có thể chứa $0, $1, $2, và vân vân. $0là toàn bộ trận đấu $1và lên tương ứng với các nhóm đối sánh tương ứng trong biểu thức chính quy. Mặc định cho $0.

Vài ví dụ

Trích xuất một địa chỉ email:

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

Kết quả trong: some@email.com

Trích xuất một số chuỗi con:

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

Kết quả trong: E-Mail: some@email.com, Name: Peter Gordon

Để tách một chuỗi kết hợp trong một ô thành các thành phần của nó trong nhiều ô:

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

Kết quả trong: Peter Gordon some@email.com...

Cách sử dụng

Để sử dụng UDF này, hãy làm như sau (đại khái là dựa trên trang Microsoft này . Họ có một số thông tin bổ sung tốt ở đó!):

  1. Trong Excel, tệp được bật Macro ('.xlsm') ALT+F11để mở Microsoft Visual Basic cho Trình chỉnh sửa ứng dụng .
  2. Thêm tham chiếu VBA vào thư viện Biểu thức chính quy (được sao chép một cách đáng xấu hổ từ câu trả lời của Portland Runners ++ ):
    1. Nhấp vào Công cụ -> Tài liệu tham khảo (vui lòng loại trừ ảnh chụp màn hình tiếng Đức) Công cụ -> Tài liệu tham khảo
    2. Tìm Microsoft VBScript Biểu thức chính quy 5.5 trong danh sách và đánh dấu vào hộp kiểm bên cạnh nó.
    3. Nhấn OK .
  3. Nhấp vào Chèn Mô-đun . Nếu bạn đặt cho mô-đun của mình một tên khác, hãy đảm bảo Mô-đun không có cùng tên với UDF bên dưới (ví dụ: đặt tên Mô-đun Regexvà hàm regexgây ra lỗi #NAME! ).

    Biểu tượng thứ hai trong hàng biểu tượng -> Mô-đun

  4. Trong cửa sổ văn bản lớn ở giữa chèn vào sau:

    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. Lưu và đóng cửa sổ Microsoft Visual Basic for Application Editor.


6
Câu trả lời này kết hợp với các bước ở đây để tạo ra một Bổ trợ, rất hữu ích. Cảm ơn bạn. Hãy chắc chắn rằng bạn không cung cấp mô-đun và chức năng của mình cùng tên!
Chris Hunt

2
Chỉ cần nhắc lại nhận xét trên từ Chris Hunt. Đừng gọi Module của bạn là 'Regex'. Nghĩ rằng tôi đã phát điên trong một thời gian vì chức năng sẽ không hoạt động do lỗi #NAME
Chris

Chà, tôi đã phát điên khi thử mọi thứ (bao gồm thay đổi mô-đun / tên) và vẫn nhận được lỗi #NAME> _> i.imgur.com/UUQ6eCi.png
Enissay

@Enissay: Hãy thử tạo một Function foo() As Variant \n foo="Hello World" \n End FunctionUDF tối thiểu để xem nó có hoạt động không. Nếu có, hãy làm việc theo cách đầy đủ ở trên, nếu không có cái gì cơ bản bị hỏng (macro bị vô hiệu hóa?).
Patrick Böker

1
@Vijay: tương tự tại github.com/malcolmp/excel-THER-expressions
Vadim

64

Mở rộng câu trả lời của patszim cho những người vội vàng.

  1. Mở sổ làm việc Excel.
  2. Alt+ F11để mở cửa sổ VBA / Macros.
  3. Thêm tham chiếu vào regex trong Công cụ sau đó Tham khảo
    ! [Mẫu VBA Excel thêm tài liệu tham khảo
  4. và chọn Microsoft VBScript Biểu thức chính quy 5.5
    ! [Excel VBA thêm tham chiếu regex
  5. Chèn một mô-đun mới (mã cần nằm trong mô-đun nếu không nó không hoạt động).
    ! [Mô-đun mã chèn Excel VBA
  6. Trong mô-đun mới được chèn,
    ! [Excel VBA chèn mã vào mô-đun
  7. thêm mã sau đây:

    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. Mẫu regex được đặt trong một trong các ô và tham chiếu tuyệt đối được sử dụng trên nó. ! [Hàm regex của Excel sử dụng trong ô Chức năng sẽ được gắn với sổ làm việc mà nó tạo ra.
    Nếu có nhu cầu sử dụng nó trong các sổ làm việc khác nhau, hãy lưu trữ chức năng trong Personal.XLSB


1
Cảm ơn bạn đã đề cập đến nó cần phải có trong Personal.xlsb để có sẵn trong tất cả các tài liệu Excel mà bạn làm việc. Hầu hết (?) Các câu trả lời khác không làm rõ điều đó. Personal.XLSB sẽ đi vào thư mục (có thể cần tạo thư mục) C: \ Users \ tên người dùng \ AppData \ Local \ Microsoft \ Excel \ XLStart thư mục
Đánh dấu

26

Đây là nỗ lực của tôi:

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

Tôi cần sử dụng chức năng này như một chức năng của tế bào (như SUMhoặc VLOOKUP) và thấy rằng thật dễ dàng để:

  1. Hãy chắc chắn rằng bạn đang ở trong Tệp Excel được bật Macro (lưu dưới dạng xlsm).
  2. Mở công cụ phát triển Alt+F11
  3. Thêm Microsoft VBScript Biểu thức chính quy 5.5 như trong các câu trả lời khác
  4. Tạo chức năng sau hoặc trong sổ làm việc hoặc trong mô-đun của chính nó:

    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. Sau đó, bạn có thể sử dụng trong ô với =REGPLACE(B1, "(\w) (\d+)", "$1$2")(ví dụ: "A 243" đến "A243")


Việc đặt tên đầu ra này đã khiến tôi thất vọng. Đó là giá trị thay thế.
Thor

1
Đúng. Tôi cho rằng tôi đã để lại mẫu có tên nên rõ ràng nó không chỉ là chuỗi thay thế và bạn có thể sử dụng các nhóm khớp với regex như $ 1 $ 2, v.v.
DeezCashews

7

Đây không phải là một câu trả lời trực tiếp nhưng có thể cung cấp một sự thay thế hiệu quả hơn cho sự cân nhắc của bạn. Đó là Google Sheets có một số Hàm Regex tích hợp, những chức năng này có thể rất thuận tiện và giúp phá vỡ một số quy trình kỹ thuật trong Excel. Rõ ràng có một số lợi thế khi sử dụng Excel trên PC của bạn, nhưng đối với phần lớn người dùng, Google Sheets sẽ cung cấp trải nghiệm giống hệt nhau và có thể cung cấp một số lợi ích về tính di động và chia sẻ tài liệu.

Họ cung cấp

REGEXEXTRACT: Trích xuất các chuỗi con phù hợp theo biểu thức chính quy.

REGEXREPLACE: Thay thế một phần của chuỗi văn bản bằng một chuỗi văn bản khác bằng các biểu thức thông thường.

SUBSTITUTE: Thay thế văn bản hiện tại bằng văn bản mới trong một chuỗi.

REPLACE: Thay thế một phần của chuỗi văn bản bằng một chuỗi văn bản khác.

Bạn có thể nhập chúng trực tiếp vào một ô như vậy và sẽ tạo ra bất cứ thứ gì bạn thích

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

Chúng cũng hoạt động khá tốt khi kết hợp với các chức năng khác như câu lệnh IF như vậy:

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

nhập mô tả hình ảnh ở đây

Hy vọng rằng điều này cung cấp một cách giải quyết đơn giản cho những người dùng cảm thấy bị chế giễu bởi thành phần VBS của Excel.


Cảm ơn đã chia sẻ Alex. Điều này hữu ích cho những người tìm kiếm phiên bản Google. Bạn có thể xem xét việc viết và trả lời một câu hỏi khác dành riêng cho Google Sheets Regex vì nó có danh pháp riêng và sẽ rất hữu ích cho những người khác. Bất kể, bạn có upvote của tôi!
Á quân Portland

4

Đây là một regex_subst()chức năng. Ví dụ:

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

Đây là mã đơn giản hóa (đơn giản hơn đối với tôi, dù sao). Tôi không thể tìm ra cách xây dựng một mẫu đầu ra phù hợp bằng cách sử dụng ở trên để làm việc như các ví dụ của tôi:

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

Tôi không muốn phải kích hoạt thư viện tham chiếu vì tôi cần các tập lệnh của mình có thể mang theo được. Các Dim foo As New VBScript_RegExp_55.RegExpdòng gây ra User Defined Type Not Definedlỗi, nhưng tôi tìm thấy một giải pháp làm việc cho tôi.

Những gì bạn sẽ muốn làm là đặt một chuỗi ví dụ trong ô A1, sau đó kiểm tra strPattern. Một khi điều đó làm việc điều chỉnh sau đó rngnhư mong muốn.

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

Tôi không muốn phải kích hoạt thư viện tham chiếu vì tôi cần các tập lệnh của mình có thể mang theo được - VBScript_RegExp_55thư viện này có mặt ở khắp mọi nơi nên có nguy cơ rất thấp không có trên một máy mục tiêu cụ thể. Và dù sao, việc chuyển từ Giới hạn sớm sang Giới hạn muộn không giải quyết được vấn đề về tính di động (mã vẫn sẽ bị lỗi, chỉ trong thời gian chạy chứ không phải thời gian biên dịch)
chris neilsen

1
Không, điều đó không đúng chút nào, tập lệnh này có thể được chia sẻ với người dùng khác mà không cho phép họ kích hoạt bất cứ thứ gì có thể mang theo được. Cảm ơn tho
FreeSoftwareServers

1
Chắc chắn, nhưng mã RegEx sẽ không thể sử dụng được . Nếu công cụ RegEx là một phần của sổ làm việc thư viện lớn hơn, tôi đoán rằng nó không gây ra lỗi biên dịch, do đó cho phép các phần khác được sử dụng có thể được coi là hữu ích
chris neilsen

1

Để thêm vào nội dung có giá trị, tôi muốn tạo lời nhắc này về lý do tại sao đôi khi RegEx trong VBA không lý tưởng. Không phải tất cả các biểu thức đều được hỗ trợ, nhưng thay vào đó có thể ném Error 5017và có thể khiến tác giả đoán (mà tôi là nạn nhân của chính mình).

Mặc dù chúng tôi có thể tìm thấy một số nguồn về những gì được hỗ trợ, nhưng thật hữu ích khi biết những siêu nhân vật nào, v.v. không được hỗ trợ. Một lời giải thích sâu hơn có thể được tìm thấy ở đây . Đề cập trong nguồn này:

"Mặc dù" biểu thức chính quy của VBScript ... phiên bản 5.5 thực hiện khá nhiều tính năng regex thiết yếu đã bị thiếu trong các phiên bản trước của VBScript. ... JavaScript và VBScript thực hiện các biểu thức chính quy theo kiểu Perl. Tuy nhiên, họ thiếu khá nhiều tính năng nâng cao có sẵn trong Perl và các hương vị biểu hiện thông thường hiện đại khác: "


Vì vậy, không được hỗ trợ là:

  • Bắt đầu chuỗi ancor \A, thay vào đó, sử dụng ^dấu mũ để khớp với tư thế trước chuỗi thứ nhất trong chuỗi
  • Kết thúc chuỗi ancor \Z, thay vào đó, sử dụng $ký hiệu đô la để khớp với tư thế sau chuỗi char cuối cùng
  • LookBehind tích cực, ví dụ: (?<=a)b(trong khi hỗ trợ LookAhead được hỗ trợ)
  • LookBehind tiêu cực, ví dụ: (?<!a)b(trong khi LookAhead tiêu cực được hỗ trợ)
  • Nhóm nguyên tử
  • Định lượng sở hữu
  • Unicode, ví dụ: \{uFFFF}
  • Các nhóm bắt giữ được đặt tên . Hoặc sử dụng các nhóm bắt được đánh số
  • Công cụ sửa đổi nội tuyến, ví dụ: /i(độ nhạy trường hợp) hoặc /g(toàn cầu), v.v. Đặt chúng thông qua các RegExpthuộc tính đối tượng> RegExp.Global = TrueRegExp.IgnoreCase = Truenếu có.
  • Điều kiện
  • Nhận xét biểu hiện thường xuyên . Thêm những điều này với 'ý kiến thường xuyên trong kịch bản

Tôi đã đánh vào tường nhiều lần bằng các biểu thức thông thường trong VBA. Thông thường với LookBehindnhưng đôi khi tôi thậm chí quên các sửa đổi. Bản thân tôi chưa trải nghiệm tất cả các phông nền được đề cập ở trên nhưng tôi nghĩ rằng tôi sẽ cố gắng mở rộng đề cập đến một số thông tin sâu hơn. Hãy bình luận / chính xác / thêm. Tiếng hét lớn cho thường xuyên- expressions.info cho rất nhiều thông tin.

PS Bạn đã đề cập đến các phương thức và chức năng VBA thông thường và tôi có thể xác nhận rằng chúng (ít nhất là với bản thân tôi) đã hữu ích theo cách riêng của chúng khi RegEx sẽ thất bại.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.