Microsoft Excel में इन-सेल और लूप दोनों में रेगुलर एक्सप्रेशंस (Regex) का उपयोग कैसे करें


592

मैं एक्सेल में नियमित अभिव्यक्तियों का उपयोग कैसे कर सकता हूं और डेटा हेरफेर के लिए एक्सेल के शक्तिशाली ग्रिड जैसे सेटअप का लाभ उठा सकता हूं?

  • एक मिलान पैटर्न या एक स्ट्रिंग में बदले हुए मूल्य को वापस करने के लिए इन-सेल फ़ंक्शन।
  • डेटा के एक कॉलम के माध्यम से लूप के लिए और आसन्न कोशिकाओं के लिए मैच निकालें।
  • क्या सेटअप आवश्यक है?
  • एक्सेल के रेगुलर एक्सप्रेशंस के लिए स्पेशल कैरेक्टर क्या हैं?

मैं समझता हूँ Regex कई स्थितियों (लिए आदर्श नहीं है उपयोग करने के लिए या नहीं रेगुलर एक्सप्रेशन का उपयोग करने के लिए? ) के बाद से एक्सेल का उपयोग कर सकते Left, Mid, Right, Instrसमान जोड़तोड़ के लिए प्रकार आदेशों।


11
मैं पैट्रिक मैथ्यूज द्वारा इस VB / VBA Regexp लेख की उच्च अनुशंसा करता हूं
brettdj

1
इस मुफ्त ऐड-इन का प्रयास करें: seotoolsforexcel.com/regexpfind
नील्स

1
चलो Like ऑपरेटर को मत भूलना , जो रेगेक्स-शैली की कार्यक्षमता का एक हल्का संस्करण प्रदान करता है। यह आमतौर पर रेगेक्स की तुलना में बहुत तेज है, भले ही उप या फ़ंक्शन प्रक्रिया में लिपटे हों।
10

जवाबों:


955

पैटर्न मिलान के लिए नियमित अभिव्यक्ति का उपयोग किया जाता है।

Excel में उपयोग करने के लिए इन चरणों का पालन करें:

चरण 1 : "Microsoft VBScript नियमित अभिव्यक्ति 5.5" में VBA संदर्भ जोड़ें

  • "डेवलपर" टैब चुनें ( मेरे पास यह टैब नहीं है कि मैं क्या करूं? )
  • "विज़ुअल बेसिक" आइकन को 'कोड' रिबन सेक्शन से चुनें
  • "Microsoft Visual Basic for Applications" विंडो में शीर्ष मेनू से "टूल" चुनें।
  • "संदर्भ" चुनें
  • अपनी कार्यपुस्तिका में शामिल करने के लिए "Microsoft VBScript रेगुलर एक्सप्रेशंस 5.5" के बगल में स्थित बॉक्स को देखें।
  • ओके पर क्लिक करें"

चरण 2 : अपने पैटर्न को परिभाषित करें

मूल परिभाषाएँ:

- रेंज।

  • उदाहरण के a-zलिए, ए से जेड तक के निचले अक्षरों से मेल खाता है
  • उदा 0-50 से 5 तक किसी भी संख्या से मेल खाता है

[] इन कोष्ठकों के अंदर की वस्तुओं में से एक का ठीक से मिलान करें।

  • जैसे [a]अक्षर a से मेल खाता है
  • उदा [abc]एक एकल अक्षर से मेल खाता है जो a, b या c हो सकता है
  • उदाहरण [a-z]के वर्णमाला के किसी भी निचले मामले पत्र से मेल खाता है।

()वापसी के उद्देश्यों के लिए समूह अलग-अलग मेल खाते हैं। नीचे दिए गए उदाहरण देखें।

{} इससे पहले परिभाषित पैटर्न की दोहराया प्रतियों के लिए गुणक।

  • उदाहरण [a]{2}दो लगातार निचले मामले पत्र से मेल खाता है:aa
  • उदाहरण के लिए [a]{1,3}कम से कम एक और तीन छोटे अक्षर पत्र से मेल खाता है a, aa,aaa

+ इससे पहले परिभाषित पैटर्न के कम से कम एक या अधिक मिलान करें।

  • उदाहरण के लिए a+मिलान कर देंगे लगातार एक के a, aa, aaa, और इतने पर

? इससे पहले परिभाषित शून्य या पैटर्न में से एक का मिलान करें।

  • ईजी पैटर्न मौजूद नहीं हो सकता है या हो सकता है लेकिन केवल एक बार ही मिलान किया जा सकता है।
  • उदाहरण के लिए [a-z]?खाली स्ट्रिंग या किसी एकल लोअर केस पत्र से मेल खाता है।

* इससे पहले परिभाषित शून्य या अधिक पैटर्न का मिलान करें। - पैटर्न के लिए ईजी वाइल्डकार्ड जो मौजूद हो या न हो। - जैसे [a-z]*खाली केस या लोअर केस लेटर्स के स्ट्रिंग से मेल खाता है।

. न्यूलाइन को छोड़कर किसी भी वर्ण से मेल खाता है \n

  • उदा a.एक दो वर्ण स्ट्रिंग के साथ शुरू होता है और कुछ को छोड़कर समाप्त होता है\n

| या ऑपरेटर

  • उदाहरण के लिए a|bया तो इसका मतलब है aया bमिलान किया जा सकता।
  • जैसे red|white|orangeकि रंगों में से एक से मेल खाता है।

^ संचालक नहीं

  • उदा [^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 अक्षर अंक हैं। यदि ऐसा है, तो उन्हें हटा दिया जाता है और बाकी स्ट्रिंग प्रदर्शित की जाती है। यदि नहीं, तो एक बॉक्स आपको बताता है कि कोई मैच नहीं मिला है। सेल A1वैल्यूज़ 12abcलौटेंगी abc, वैल्यू ऑफ़ 1abcरिटर्न abc, वैल्यू ऑफ़ abc123द रिटर्न "नॉट मैचेड" क्योंकि अंक स्ट्रिंग की शुरुआत में नहीं थे।

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

सेल में अपने तार ("12abc") रखें A1। इस सूत्र =simpleCellRegex(A1)को सेल में दर्ज करें B1और परिणाम "एबीसी" होगा।

परिणाम छवि


उदाहरण 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) और एक स्ट्रिंग के लिए दिखता तीन एक भी अल्फा चरित्र के बाद अंक और फिर 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। आप मेमोरी से बाहर निकल जाएंगे, जब उस सब को अक्सर पर्याप्त रूप से निष्पादित किया जाता है।
किरिल

1
मैंने और अधिक जटिल रेगेक्स के इलाज के लिए उपमेचे के साथ उदाहरण 4 को अनुकूलित किया , मूल रूप से मैं विभाजित करने के दौरान प्रतिस्थापन का उपयोग नहीं करता, अगर किसी को दिलचस्पी है: stackoverflow.com/questions/30218413/…
आर्मफूट

11
लेट बाइंडिंग लाइन:Set regEx = CreateObject("VBScript.RegExp")
ZygD

2
ठीक है, मुझे पूरा यकीन है कि यह कोड में है ThisWorkbook। कोड को अलग करने का प्रयास करें Module
पोर्टलैंड रनर

3
"प्रोजेक्ट एक्सप्लोरर" (?) में @PortlandRunner इस एक्सेल फ़ाइल में "मॉड्यूल" सबफ़ोल्डर का अभाव था, हालाँकि एक अन्य फ़ाइल में एक दिखाया गया था। फ़ाइल को राइट-क्लिक किया और 'इन्सर्ट मॉड्यूल' चुना, फिर "मॉड्यूल 1" पर डबल-क्लिक किया और कोड को पेस्ट किया। बचाया। कार्यपुस्तिका पर वापस जाएं और फ़ंक्शन में फिर से कुंजी - यह काम किया। मेरे जैसे अनुभवहीन के लिए, जवाब में उल्लेखनीय हो सकता है? सहायता के लिए धन्यवाद।
youcantryreachingme

205

एक्सेल फ़ार्मुलों में सीधे नियमित अभिव्यक्ति का उपयोग करने के लिए निम्नलिखित यूडीएफ (उपयोगकर्ता परिभाषित फ़ंक्शन) मदद कर सकता है। यह कम या ज्यादा सीधे एक्सेल फ़ंक्शन के रूप में नियमित अभिव्यक्ति कार्यक्षमता को उजागर करता है।

यह काम किस प्रकार करता है

इसमें 2-3 पैरामीटर लगते हैं।

  1. पर नियमित अभिव्यक्ति का उपयोग करने के लिए एक पाठ।
  2. एक नियमित अभिव्यक्ति।
  3. एक प्रारूप स्ट्रिंग निर्दिष्ट करता है कि परिणाम कैसे दिखना चाहिए। यह शामिल कर सकते हैं $0, $1, $2, और इतने पर। $0पूरा मैच है, $1और नियमित अभिव्यक्ति में संबंधित मैच समूहों के अनुरूप है। के लिए चूक $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. एक्सेल में एक मैक्रो सक्षम फ़ाइल ('.xlsm') में अनुप्रयोग संपादक के लिए Microsoft Visual BasicALT+F11 खोलने के लिए धक्का ।
  2. रेगुलर एक्सप्रेशंस लाइब्रेरी में VBA संदर्भ जोड़ें ( पोर्टलैंड रनरर्स + उत्तर से बेशर्मी से कॉपी ):
    1. टूल्स पर क्लिक करें -> संदर्भ (जर्मन स्क्रीनशॉट को माफ करें) उपकरण -> संदर्भ
    2. सूची में Microsoft VBScript रेगुलर एक्सप्रेशन 5.5 खोजें और इसके आगे स्थित चेकबॉक्स पर टिक करें।
    3. ओके पर क्लिक करें ।
  3. इन्सर्ट मॉड्यूल पर क्लिक करें । यदि आप अपने मॉड्यूल को एक अलग नाम देते हैं, तो सुनिश्चित करें कि मॉड्यूल में UDF के समान नाम नहीं है (उदाहरण के लिए मॉड्यूल का नामकरण Regexऔर फ़ंक्शन #NAME! त्रुटियों का regexकारण बनता है )।

    आइकन पंक्ति में दूसरा आइकन -> मॉड्यूल

  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 को सहेजें और बंद करें ।


6
ऐड-इन बनाने के लिए यहां दिए गए चरणों के साथ संयुक्त यह उत्तर बहुत मददगार रहा है। धन्यवाद। सुनिश्चित करें कि आप अपना मॉड्यूल नहीं देते हैं और उसी नाम को काम करते हैं!
क्रिस हंट

2
क्रिस हंट से ऊपर की टिप्पणी को दोहराते हुए। अपने मॉड्यूल को 'Regex' भी न कहें। सोचा कि मैं थोड़ी देर के लिए पागल हो रहा हूं क्योंकि #NAME त्रुटि के कारण फ़ंक्शन काम नहीं करेगा
क्रिस

ठीक है, मैं पागल हो गया हूँ क्योंकि मैंने सब कुछ (मॉड्यूल / नामों को बदलने सहित) की कोशिश की और अभी भी # नाम त्रुटि> _> i.imgur.com/UUQ6eCi.png
Enissay

@ एनीसे: Function foo() As Variant \n foo="Hello World" \n End Functionयह देखने के लिए कि क्या काम करता है, एक न्यूनतम यूडीएफ बनाने का प्रयास करें । यदि हाँ, तो ऊपर की पूरी चीज़ पर अपना काम करें, अगर कोई बुनियादी चीज़ टूटी हुई नहीं है (मैक्रोज़ अक्षम?)।
पैट्रिक बॉकर


64

एक भीड़ में उन लोगों के लिए patszim के जवाब पर विस्तार ।

  1. एक्सेल वर्कबुक खोलें।
  2. Alt+ F11VBA / Macros विंडो खोलने के लिए।
  3. Regex को Tools और References के अंतर्गत संदर्भ जोड़ें
    [! एक्सेल VBA फॉर्म संदर्भ जोड़ें
  4. और Microsoft VBScript नियमित अभिव्यक्ति 5.5 का चयन करना
    [! एक्सेल VBA regex संदर्भ जोड़ें
  5. एक नया मॉड्यूल डालें (कोड को मॉड्यूल में रहने की आवश्यकता है अन्यथा यह काम नहीं करता है)।
    [! एक्सेल VBA कोड मॉड्यूल डालें
  6. नए सम्मिलित मॉड्यूल में,
    [! एक्सेल 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
यह उल्लेख करने के लिए धन्यवाद कि आपके द्वारा काम करने वाले सभी एक्सेल दस्तावेजों में Personal.xlsb में उपलब्ध होने की आवश्यकता है। अधिकांश (?) अन्य उत्तर स्पष्ट नहीं करते हैं। Personal.XLSB फ़ोल्डर में जाएगा (फ़ोल्डर बनाने की आवश्यकता हो सकती है) C: \ Users \ उपयोगकर्ता नाम \ AppData \ Local \ Microsoft \ Excel \ XLStart फ़ोल्डर
मार्क स्टीवर्ट

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. सुनिश्चित करें कि आप मैक्रो एनेबल्ड एक्सेल फाइल (xlsm के रूप में सहेजें) में हैं।
  2. डेवलपर उपकरण Alt+ खोलेंF11
  3. अन्य उत्तरों की तरह Microsoft VBScript रेगुलर एक्सप्रेशंस 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")


आउटपुटपैटर्न के इस नामकरण ने मुझे दूर कर दिया। यह प्रतिस्थापन मूल्य है।
थोर

1
हाँ। मुझे लगता है कि मैंने इसे नाम दिया पैटर्न छोड़ दिया, तो यह स्पष्ट था कि यह केवल स्ट्रिंग प्रतिस्थापन नहीं था और आप $ 1 $ 2 आदि जैसे regex मिलान समूहों का उपयोग कर सकते हैं
DeezCashews

7

यह प्रत्यक्ष उत्तर नहीं है, लेकिन आपके विचार के लिए अधिक कुशल विकल्प प्रदान कर सकता है। जो यह है कि Google शीट ने रेगेक्स फ़ंक्शंस में कई निर्माण किए हैं ये बहुत सुविधाजनक हो सकते हैं और एक्सेल में कुछ तकनीकी प्रक्रियाओं को दरकिनार करने में मदद कर सकते हैं। जाहिर है आपके पीसी पर एक्सेल का उपयोग करने के कुछ फायदे हैं लेकिन अधिकांश उपयोगकर्ताओं के लिए Google पत्रक एक समान अनुभव प्रदान करेंगे और दस्तावेजों के पोर्टेबिलिटी और साझाकरण में कुछ लाभ प्रदान कर सकते हैं।

वे प्रस्ताव देते है

REGEXEXTRACT: रेगुलर एक्सप्रेशन के हिसाब से मैचिंग सब्स्टिट्यूट निकालता है।

REGEXREPLACE: नियमित अभिव्यक्ति का उपयोग करके एक अलग पाठ स्ट्रिंग के साथ एक पाठ स्ट्रिंग का हिस्सा बदलता है।

SUBSTITUTE: एक स्ट्रिंग में नए पाठ के साथ मौजूदा पाठ को बदलता है।

प्रतिक्रिया: एक पाठ स्ट्रिंग का एक अलग पाठ स्ट्रिंग के साथ हिस्सा बदलता है।

आप इन्हें सीधे एक सेल में टाइप कर सकते हैं और जो भी आप चाहते हैं उसका उत्पादन करेंगे

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

वे अन्य कार्यों जैसे IF स्टेटमेंट्स के साथ संयोजन में भी बहुत अच्छा काम करते हैं :

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

यहाँ छवि विवरण दर्ज करें

उम्मीद है कि यह उन उपयोगकर्ताओं के लिए एक सरल समाधान प्रदान करता है जो एक्सेल के वीबीएस घटक द्वारा ताना महसूस करते हैं।


एलेक्स को साझा करने के लिए धन्यवाद। यह Google संस्करण की तलाश करने वालों के लिए उपयोगी है। आप Google Sheets Regex के लिए किसी अन्य प्रश्न को लिखने और उसका जवाब देने पर विचार कर सकते हैं क्योंकि इसका अपना नामकरण है और यह दूसरों के लिए बहुत उपयोगी होगा। भले ही, तुम मेरे upvote हो!
पोर्टलैंड रनर

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पुस्तकालय बहुत अधिक सर्वव्यापी है इसलिए किसी विशेष लक्ष्य मशीन पर नहीं होने का बहुत कम जोखिम वहन करता है। और वैसे भी, अर्ली बाउंड से लेट बाउंड में स्विच करने से पोर्टेबिलिटी की समस्या हल नहीं होती (कोड अभी भी त्रुटि होगी, केवल संकलन समय के बजाय रन टाइम पर)
क्रिस नीलसन

1
नहीं, यह बिल्कुल भी सच नहीं है, इस स्क्रिप्ट को किसी अन्य उपयोगकर्ता के साथ साझा किया जा सकता है, जो उन्हें पोर्टेबल है। धन्यवाद tho
FreeSoftwareServers

1
ज़रूर, लेकिन RegEx कोड प्रयोग करने योग्य नहीं होगा । यदि RegEx सामान एक बड़े पुस्तकालय कार्यपुस्तिका का हिस्सा है, तो मुझे लगता है कि यह एक संकलन त्रुटि नहीं है इसलिए अन्य भागों का उपयोग करने की अनुमति देना उपयोगी माना जा सकता है
क्रिस नील्सन

1

मूल्यवान सामग्री में जोड़ने के लिए, मैं यह अनुस्मारक बनाना चाहूंगा कि कभी-कभी VBA के भीतर RegEx आदर्श क्यों नहीं है। सभी अभिव्यक्तियों का समर्थन नहीं किया जाता है, लेकिन इसके बजाय एक फेंक सकते हैं Error 5017और लेखक को अनुमान लगा सकते हैं (जो मैं खुद का शिकार हूं)।

वैसे तो हम कुछ पा सकते हैं स्रोतों क्या पर है का समर्थन किया, यह पता करने के लिए मददगार है जो अक्षरों से परे आदि कर रहे हैं हो सकता है नहीं का समर्थन किया। अधिक गहराई से स्पष्टीकरण यहाँ पाया जा सकता है । इस स्रोत में उल्लेख किया गया है:

"हालांकि" VBScript की नियमित अभिव्यक्ति ... संस्करण 5.5 में कुछ आवश्यक regex विशेषताएं हैं जो VBScript के पिछले संस्करणों में गायब थे। ... जावास्क्रिप्ट और VBScript पर्ल शैली के नियमित भावों को लागू करते हैं। हालांकि, उनके पास पर्ल और अन्य आधुनिक नियमित अभिव्यक्ति स्वादों में काफी उन्नत सुविधाओं की कमी है: "


तो, समर्थित नहीं हैं:

  • स्ट्रिंग एंकोर की शुरुआत \A, वैकल्पिक रूप से स्ट्रिंग में 1 चार्ट ^से पहले पोस्ट मैच के लिए कैरेट का उपयोग करें
  • स्ट्रिंग एंकॉर का अंत \Z$ में अंतिम चार के बाद पोस्ट मैच के लिए वैकल्पिक रूप से डॉलर चिह्न का उपयोग करें
  • पॉजिटिव लुकबाइंड, उदा: (?<=a)b(पोस्टिव लुकअहेड है समर्थित)
  • नकारात्मक लुकहाइंड, उदाहरण के लिए: (?<!a)b(नकारात्मक लुकअप के साथ है समर्थित)
  • परमाणु समूहन
  • पॉजेसिव क्वांटिफायर
  • यूनिकोड जैसे: \{uFFFF}
  • जिसका नाम कैप्चरिंग ग्रुप रखा गया । वैकल्पिक रूप से उपयोग करें क्रमांकित कैप्चरिंग समूहों का
  • इनलाइन संशोधक, जैसे: /i(केस सेंसिटिविटी) या /g(वैश्विक) आदि इनको RegExpऑब्जेक्ट गुण> RegExp.Global = Trueऔर के माध्यम से सेट करेंRegExp.IgnoreCase = True यदि उपलब्ध हो, के ।
  • सशर्त,
  • नियमित अभिव्यक्ति टिप्पणियाँ । इन्हें 'स्क्रिप्ट में नियमित टिप्पणियों के साथ जोड़ें

मैं पहले से ही एक बार VBA के भीतर नियमित अभिव्यक्ति का उपयोग करते हुए एक दीवार से अधिक हिट करता हूं। आमतौर पर LookBehindलेकिन कभी-कभी मैं मॉडिफायर्स भूल भी जाता हूं। मैंने स्वयं इन सभी उपर्युक्त पृष्ठभूमि का अनुभव नहीं किया है, लेकिन मैंने सोचा कि मैं कुछ और अधिक गहन जानकारी का उल्लेख करने की कोशिश करूंगा। टिप्पणी / सही / जोड़ने के लिए स्वतंत्र महसूस करें। बड़ा चिल्लायाजानकारी के एक धन के नियमित-expressions.info के लिए ।

PS आपने नियमित VBA विधियों और कार्यों का उल्लेख किया है, और मैं पुष्टि कर सकता हूं कि वे (कम से कम अपने आप में) अपने तरीके से मददगार रहे हैं जहां RegEx विफल हो जाएगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.