ইন-সেল এবং লুপ উভয়ই মাইক্রোসফ্ট এক্সেলে নিয়মিত এক্সপ্রেশন (রেজেক্স) কীভাবে ব্যবহার করবেন


592

আমি কীভাবে এক্সেলের নিয়মিত এক্সপ্রেশন ব্যবহার করতে পারি এবং ডেটা ম্যানিপুলেশনের জন্য এক্সেলের শক্তিশালী গ্রিডের মতো সেটআপের সুবিধা নিতে পারি?

  • একটি স্ট্রিংয়ের সাথে মিলিত প্যাটার্ন বা প্রতিস্থাপিত মানটি ফেরত দিতে ইন-সেল ফাংশন।
  • উপাত্তের একটি কলামের মধ্য দিয়ে লুপ হয়ে যায় এবং সংলগ্ন কক্ষগুলিতে মিলগুলি বের করে।
  • কি সেটআপ প্রয়োজন?
  • নিয়মিত প্রকাশের জন্য এক্সেলের বিশেষ অক্ষরগুলি কী কী?

আমি বুঝতে Regex অনেক পরিস্থিতিতে (জন্য আদর্শ নয় ব্যবহার করতে বা না রেগুলার এক্সপ্রেশনের ব্যবহার করতে হয়? ) যেহেতু সীমা অতিক্রম করা ব্যবহার করতে পারেন Left, Mid, Right, Instrঅনুরূপ হেরফেরের জন্য টাইপ কমান্ড।


11
আমি প্যাট্রিক ম্যাথিউজের এই ভিবি / ভিবিএ রিজএক্সপ্যাক্টের উচ্চতর প্রস্তাব দিচ্ছি
brettdj


1
আসুন Like অপারেটরটি ভুলে যাবেন না , যা রেজেক্স-স্টাইল কার্যকারিতার এক ধরণের হালকা সংস্করণ সরবরাহ করে। এটি সাধারণত সাব বা ফাংশন পদ্ধতিতে আবৃত থাকলেও রেগেক্সের চেয়ে অনেক দ্রুত।
এগলথ

উত্তর:


955

প্যাটার্ন ম্যাচিংয়ের জন্য নিয়মিত প্রকাশগুলি ব্যবহৃত হয়।

এক্সেল ব্যবহার করতে এই পদক্ষেপগুলি অনুসরণ করুন:

পদক্ষেপ 1 : "মাইক্রোসফ্ট ভিবিএস স্ক্রিপ্ট নিয়মিত এক্সপ্রেশন 5.5" তে ভিবিএ রেফারেন্স যুক্ত করুন

  • "বিকাশকারী" ট্যাবটি নির্বাচন করুন ( আমি কী করব এই ট্যাবটি আমার কাছে নেই? )
  • 'কোড' ফিতা বিভাগ থেকে "ভিজ্যুয়াল বেসিক" আইকনটি নির্বাচন করুন
  • "অ্যাপ্লিকেশনগুলির জন্য মাইক্রোসফ্ট ভিজ্যুয়াল বেসিক" উইন্ডোতে উপরের মেনু থেকে "সরঞ্জাম" নির্বাচন করুন।
  • "তথ্যসূত্র" নির্বাচন করুন
  • আপনার ওয়ার্কবুকের অন্তর্ভুক্ত করতে "মাইক্রোসফ্ট ভিবিএস স্ক্রিপ্ট নিয়মিত এক্সপ্রেশন 5.5" এর পাশের বক্সটি চেক করুন।
  • "ওকে" ক্লিক করুন

পদক্ষেপ 2 : আপনার নিদর্শন সংজ্ঞায়িত করুন

প্রাথমিক সংজ্ঞা:

- পরিসীমা।

  • উদাহরণস্বরূপ a-zএকটি থেকে জেতে একটি ছোট ছোট অক্ষরের সাথে মেলে
  • যেমন 0-50 থেকে 5 পর্যন্ত যে কোনও সংখ্যার সাথে মেলে

[] এই বন্ধনীগুলির অভ্যন্তরের অবজেক্টগুলির মধ্যে একটির সাথে ঠিক মিল করুন।

  • উদাহরণস্বরূপ [a]অক্ষরের সাথে মেলে a
  • উদাহরণস্বরূপ [abc]একটি একক বর্ণের সাথে মেলে যা একটি, বি বা সি হতে পারে
  • উদাহরণস্বরূপ [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"মিলবে না" ফিরে আসবে কারণ স্ট্রিংয়ের শুরুতে অঙ্কগুলি ছিল না at

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এবং ফলাফল "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) এর মধ্য দিয়ে যায় এবং তিনটি অঙ্কের সাথে শুরু করে একটি একক আলফা অক্ষর এবং তারপরে 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 অভিযোজিত SubMatches আরো জটিল Regex চিকিত্সার জন্য, মূলত আমি প্রতিস্থাপন ব্যবহার করবেন না যখন বিভাজন, যদি কেউ আগ্রহী হয়: stackoverflow.com/questions/30218413/...
Armfoot

11
দেরীতে বাইন্ডিং লাইন:Set regEx = CreateObject("VBScript.RegExp")
জাইজিডি

2
ঠিক আছে, আমি বেশ নিশ্চিত যে কোডটি হওয়ায় এটি ThisWorkbook। কোডটি আলাদাভাবে সরানোর চেষ্টা করুন Module
পোর্টল্যান্ড রানার

3
"প্রজেক্ট এক্সপ্লোরার" (?) এ @ পোর্টল্যান্ডআরনার এই এক্সেল ফাইলটির একটি "মডিউল" সাবফোল্ডার নেই, যদিও অন্য ফাইলটি দেখায়। ফাইলটি ডান-ক্লিক করে 'সন্নিবেশ করা মডিউল' চয়ন করেছে, তারপরে "মডিউল 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...

ব্যবহারবিধি

এই ইউডিএফটি ব্যবহার করতে নিম্নলিখিতগুলি করুন (মোটামুটি এই মাইক্রোসফ্ট পৃষ্ঠার উপর ভিত্তি করে They সেখানে তাদের কিছু ভাল অতিরিক্ত তথ্য রয়েছে!):

  1. এক্সেলে ইন ম্যাক্রো সক্ষম ফাইল ('.xlsm') অ্যাপ্লিকেশন সম্পাদকের জন্য মাইক্রোসফ্ট ভিজ্যুয়াল বেসিকটিALT+F11 খুলতে চাপ দিন ।
  2. নিয়মিত এক্সপ্রেশন লাইব্রেরিতে ভিবিএ রেফারেন্স যুক্ত করুন ( পোর্টল্যান্ড রানার্স ++ উত্তর থেকে নির্লজ্জভাবে অনুলিপি করেছেন ):
    1. সরঞ্জামগুলিতে ক্লিক করুন -> তথ্যসূত্র (দয়া করে জার্মান স্ক্রিনশটটি ক্ষমা করুন) সরঞ্জাম -> তথ্যসূত্র
    2. এই মাইক্রোসফট VB স্ক্রিপ্ট রেগুলার এক্সপ্রেশন 5.5 তালিকায় এবং পাশে চেকবক্স টিক্।
    3. ঠিক আছে ক্লিক করুন ।
  3. সন্নিবেশ মডিউল ক্লিক করুন । আপনি আপনার মডিউল একটি আলাদা নাম করতে দেবে নিশ্চিত মডিউল নেই না নিচে ইউডিএফ হিসাবে একই নাম আছে (যেমন মডিউল নামকরণ 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. মাইক্রোসফ্ট ভিজ্যুয়াল বেসিকের জন্য অ্যাপ্লিকেশন সম্পাদক উইন্ডোটি সংরক্ষণ এবং বন্ধ করুন ।


6
অ্যাড-ইন তৈরির জন্য এখানে পদক্ষেপের সাথে মিলিত এই উত্তরটি খুব সহায়ক হয়েছিল। ধন্যবাদ. নিশ্চিত করুন যে আপনি নিজের মডিউলটি দিচ্ছেন না এবং একই নামে কাজ করবেন!
ক্রিস হান্ট

2
কেবল ক্রিস হান্টের উপরের মন্তব্যটির পুনরাবৃত্তি করুন। পাশাপাশি আপনার মডিউলটিকে 'রেজেক্স' বলবেন না। ভেবেছিলাম আমি কিছুক্ষণের জন্য পাগল হয়ে যাচ্ছি কারণ #NAME ত্রুটির কারণে ফাংশনটি কাজ করবে না
ক্রিস

ঠিক আছে, আমি সমস্ত চেষ্টা করার পরে আমি বাদাম হয়ে গেছি (মডিউল / নাম পরিবর্তন সহ) এবং এখনও #NAME ত্রুটি পেয়ে যাচ্ছি _ _> i.imgur.com/UUQ6eCi.png
এনিসায়

@ এনিসে: এটি কার্যকর Function foo() As Variant \n foo="Hello World" \n End Functionহয় কিনা তা দেখার জন্য একটি ন্যূনতম ইউডিএফ তৈরি করার চেষ্টা করুন । যদি হ্যাঁ, উপরের সম্পূর্ণ জিনিস পর্যন্ত নিজের পথে কাজ করুন, যদি কোনও মৌলিক কিছু ভাঙা না যায় (ম্যাক্রো অক্ষম?)
প্যাট্রিক বেকার


64

উপর সম্প্রসারিত patszim এর উত্তর একটি ভিড়ের মধ্যে তাদের জন্য।

  1. এক্সেল ওয়ার্কবুক খুলুন।
  2. Alt+ +F11 ভিবিএ / ম্যাক্রো উইন্ডো খুলতে।
  3. সরঞ্জামগুলি এরপরে রেগেক্সে রেফারেন্স যুক্ত করুন তারপর রেফারেন্স
    [এক্সেল ভিবিএ ফর্ম উল্লেখ যুক্ত করুন
  4. এবং মাইক্রোসফ্ট ভিবিএস স্ক্রিপ্ট নিয়মিত এক্সপ্রেশন নির্বাচন 5.5
    ! [এক্সেল ভিবিএ যোগ করুন রেগেক্স রেফারেন্স
  5. একটি নতুন মডিউল Inোকান (কোডটি মডিউলে থাকা উচিত অন্যথায় এটি কাজ করে না)।
    [এক্সেল ভিবিএ সন্নিবেশ কোড মডিউল
  6. সদ্য inোকানো মডিউলটিতে,
    [এক্সেল ভিবিএ মডিউলটিতে কোড প্রবেশ করান
  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. রেজেক্স প্যাটার্নটি কোনও এককোষে স্থাপন করা হয় এবং এতে পরম রেফারেন্সিং ব্যবহৃত হয়। ! [এক্সেল রেজেক্স ইন-সেল ব্যবহারের কাজ করে ফাংশনটি তার তৈরি ওয়ার্কবুকের সাথে আবদ্ধ হবে
    it যদি এটির জন্য বিভিন্ন ওয়ার্কবুক ব্যবহার করার প্রয়োজন হয় তবে ফাংশনটি ব্যক্তিগত.এক্সএলএসবিতে সঞ্চয় করুন


1
আপনি যে সমস্ত এক্সেল ডকুমেন্টে কাজ করেন সেগুলিতে এটি ব্যক্তিগত.এক্সএলএসবিতে থাকা দরকার উল্লেখ করার জন্য ধন্যবাদ। বেশিরভাগ (?) উত্তরগুলি এটি পরিষ্কার করে না। ব্যক্তিগত.এক্সএলএসবি ফোল্ডারে যাবে (ফোল্ডারটি তৈরি করার প্রয়োজন হতে পারে) সি: \ ব্যবহারকারীদের ব্যবহারকারীর নাম D অ্যাপডাটা \ লোকাল \ মাইক্রোসফ্ট \ এক্সেল \ এক্সএল স্টার্ট ফোল্ডার
মার্ক স্টিয়ার্ট

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. নিশ্চিত হয়ে নিন যে আপনি ম্যাক্রো এনএবেলড এক্সেল ফাইলে রয়েছেন (এক্সএলএসএম হিসাবে সংরক্ষণ করুন)।
  2. বিকাশকারী সরঞ্জামগুলি খুলুন Alt+F11
  3. অন্যান্য উত্তরের মত মাইক্রোসফ্ট ভিবিএস স্ক্রিপ্ট নিয়মিত এক্সপ্রেশন 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
হ্যাঁ. আমি মনে করি আমি এটির নামটি রেখেছি সুতরাং এটি স্পষ্ট ছিল যে এটি কেবল স্ট্রিং প্রতিস্থাপন নয় এবং আপনি
রেজেক্সের সাথে

7

এটি সরাসরি উত্তর নয় তবে আপনার বিবেচনার জন্য আরও কার্যকর বিকল্প সরবরাহ করতে পারে। কোনটি হ'ল গুগল শীটগুলির রেজিেক্স ফাংশনগুলিতে বেশ কয়েকটি নির্মিত হয়েছে এটি খুব সুবিধাজনক হতে পারে এবং এক্সেলের কিছু প্রযুক্তিগত প্রক্রিয়া থেকে বিরত রাখতে সহায়তা করে। স্পষ্টতই আপনার পিসিতে এক্সেল ব্যবহারের কিছু সুবিধা রয়েছে তবে বৃহত সংখ্যাগরিষ্ঠ ব্যবহারকারীর জন্য গুগল শিটগুলি অভিন্ন অভিজ্ঞতা দেবে এবং বহনযোগ্যতা এবং দস্তাবেজগুলি ভাগ করে নেওয়ার ক্ষেত্রে কিছু সুবিধা দিতে পারে।

তারা অফার

রেগেক্সট্রাক্ট: একটি নিয়মিত এক্সপ্রেশন অনুযায়ী মিলের সাবস্ট্রিংগুলি নিষ্কাশন করে।

REGEXREPLACE: নিয়মিত এক্সপ্রেশন ব্যবহার করে একটি পাঠ্য স্ট্রিংয়ের অংশটিকে ভিন্ন পাঠ্য স্ট্রিংয়ের সাথে প্রতিস্থাপন করে।

সাবস্টিটিউট: বিদ্যমান পাঠ্যটিকে স্ট্রিংয়ে নতুন পাঠ্যের সাথে প্রতিস্থাপন করে।

প্রতিস্থাপন: একটি পাঠ্য স্ট্রিংয়ের অংশটিকে ভিন্ন পাঠ্য স্ট্রিংয়ের সাথে প্রতিস্থাপন করে।

আপনি এগুলিতে সরাসরি কোনও ঘরে এগুলি টাইপ করতে পারেন এবং আপনি যা চান তা উত্পাদন করতে পারেন

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

তারা অন্যান্য ফাংশনগুলির সাথে সংমিশ্রণে যেমন আইএফ এর বিবৃতিতেও বেশ ভালভাবে কাজ করে :

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

এখানে চিত্র বর্ণনা লিখুন

আশা করি এক্সেল এর ভিবিএস উপাদান দ্বারা প্রতারিত বোধ করেন এমন ব্যবহারকারীদের জন্য এটি একটি সহজ কাজ সরবরাহ করে।


অ্যালেক্স ভাগ করে নেওয়ার জন্য ধন্যবাদ। এটি গুগল সংস্করণ সন্ধানকারীদের জন্য দরকারী। আপনি গুগল শিটস রেজেক্সের সাথে নির্দিষ্ট অন্য একটি প্রশ্নের লিখন এবং উত্তর দেওয়ার বিষয়ে বিবেচনা করতে পারেন কারণ এটির নিজস্ব নামকরণ রয়েছে এবং এটি অন্যদের জন্য খুব দরকারী। নির্বিশেষে, আপনি আমার 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
না, এটি মোটেও সত্য নয়, এই স্ক্রিপ্টটি অন্য কোনও ব্যবহারকারীর সাথে ভাগ করা যায় যা এগুলি বহনযোগ্য is ধন্যবাদ
ফ্রিসফটওয়্যার সার্ভার

1
অবশ্যই, তবে RegEx কোড ব্যবহারযোগ্য হবে না । যদি রেজিএক্স স্টাফগুলি একটি বৃহত্তর গ্রন্থাগারের ওয়ার্কবুকের অংশ হয় তবে আমার ধারণা এটি একটি সংকলন ত্রুটি না ছুঁড়েছে তাই অন্য অংশগুলি ব্যবহার করার অনুমতি দেয় কারণ এটি বিবেচনা করা যেতে পারে
ছুঁড়েছে

1

মূল্যবান সামগ্রীতে যোগ করার জন্য, আমি ভিবিএর মধ্যে মাঝে মাঝে রেজিএক্স কেন আদর্শ নয় সে সম্পর্কে এই অনুস্মারকটি তৈরি করতে চাই। সমস্ত এক্সপ্রেশন সমর্থিত নয়, তবে পরিবর্তে এটি ফেলে দিতে পারে Error 5017এবং লেখককে অনুমান করতে ছাড়তে পারে (যা আমি নিজের শিকার হয়েছি)।

যদিও আমরা কিছু খুঁজে পেতে পারি উত্স কি হয় সমর্থিত, এটা helpfull জানেন যে যা metacharacters ইত্যাদি হয় হবে না সমর্থিত। আরও গভীরতর ব্যাখ্যা এখানে পাওয়া যাবে । এই উত্সে উল্লেখ করা:

"যদিও" ভিবিএস স্ক্রিপ্টের নিয়মিত অভিব্যক্তি ... 5.5 সংস্করণে ভিবিএসক্রিপ্টের পূর্ববর্তী সংস্করণগুলিতে হারিয়ে যাওয়া বেশ কয়েকটি প্রয়োজনীয় রেজেক্স বৈশিষ্ট্য প্রয়োগ করে। ... জাভাস্ক্রিপ্ট এবং ভিবিএস স্ক্রিপ্ট পার্ল-স্টাইল নিয়মিত এক্সপ্রেশন প্রয়োগ করে। তবে পার্ল এবং অন্যান্য আধুনিক নিয়মিত প্রকাশের স্বাদে তাদের বেশ কয়েকটি উন্নত বৈশিষ্ট্য উপলব্ধ রয়েছে: "


সুতরাং, সমর্থিত নয় :


আমি ইতিমধ্যে ভিবিএর মধ্যে নিয়মিত অভিব্যক্তিগুলি ব্যবহার করে একাধিকবার একটি প্রাচীরকে আঘাত করেছি। সাধারণত LookBehindতবে কখনও কখনও আমি সংশোধকগুলিও ভুলে যাই। আমি উল্লিখিত এই সমস্ত ব্যাকড্রপগুলি নিজেই অভিজ্ঞতা অর্জন করতে পারি নি তবে ভেবেছিলাম আরও কিছু গভীরতর তথ্যের উল্লেখ করে আমি বিস্তৃত হওয়ার চেষ্টা করব। মন্তব্য / সঠিক / যোগ করতে নির্দ্বিধায়। প্রচুর তথ্যের জন্য নিয়মিত- এক্সপ্রেসন.ইনফোতে বড় চিৎকার ।

পিএস আপনি নিয়মিত ভিবিএ পদ্ধতি এবং ফাংশন উল্লেখ করেছেন এবং আমি নিশ্চিত করতে পারি যে সেগুলি (অন্তত আমার কাছে) তাদের নিজস্ব উপায়ে সহায়তা করেছে যেখানে রেজিএক্স ব্যর্থ হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.