RegEx Deseni - C#

Katılım
17 Haziran 2008
Mesajlar
1,840
Excel Vers. ve Dili
Microsoft Ofis Profesyonel 2019 x64 TR
Altın Üyelik Bitiş Tarihi
26-03-2020
Merhaba arkadaşlar;

Regex deseni(patern) konusunda yardımcı olabilirmisiniz

alt kısımda vermiş olduğum değerleri Grup1 ve Grup2 olarak regex patern nasıl yazmalıyım ?

Grup1 = 15 lik duvarın metrekareleri
Grup2 = 20 lik duvarların metrekareleri


15 luk duvar : 1.17
15 luk duvar : 4.81
15 luk duvar : 7.67
15 luk duvar : 7.8
15 luk duvar : 10.4
15 luk duvar : 3.51
15 luk duvar : 4.42
15 luk duvar : 15.6
20 luk duvar : 15.34
20 luk duvar : 15.34
20 luk duvar : 30.94
20 luk duvar : 30.94
 

veyselemre

Özel Üye
Katılım
9 Mart 2005
Mesajlar
3,591
Excel Vers. ve Dili
Pro Plus 2021
İnternetten bulduğum kodları uyarladım.

C#:
using System;
using System.Text.RegularExpressions;
namespace regex
{
    class Program
    {
        static void Main(string[] args)
        {

            Regex rgx15 = new Regex(@"15\sluk\sduvar\s:\s(.*)\sm²");
            Regex rgx20 = new Regex(@"20\sluk\sduvar\s:\s(.*)\sm²");

            string[] tests = { "15 luk duvar : 1.17 m²", "15 luk duvar : 4.81 m²", "15 luk duvar : 7.67 m²",
                "15 luk duvar : 7.8 m²", "15 luk duvar : 10.4 m²", "15 luk duvar : 3.51 m²",
                "15 luk duvar : 4.42 m²", "15 luk duvar : 15.6 m²", "20 luk duvar : 15.34 m²",
                "20 luk duvar : 15.34 m²", "20 luk duvar : 30.94 m²", "20 luk duvar : 30.94 m²" , "25 luk duvar : 30.94 m²"};
            double toplam15lik=0;
            double toplam20lik=0;

            foreach (string test in tests)
            {
                if (rgx15.IsMatch(test))

                    foreach (Match m in rgx15.Matches(test))
                    {
                        toplam15lik += double.Parse(m.Groups[1].ToString ());
                        Console.WriteLine("15 lik : " + m.Groups[1]);
                    }
                else if (rgx20.IsMatch(test))

                    foreach (Match m in rgx20.Matches(test))
                    {
                        toplam20lik += double.Parse(m.Groups[1].ToString());
                        Console.WriteLine("20 lik : " + m.Groups[1]);
                    }
                else
                    Console.WriteLine("{0} 2 duruma da uymayan veri", test);
            }

            Console.WriteLine("15 lik duvar toplamı : {0}", toplam15lik.ToString() );
            Console.WriteLine("20 lik duvar toplamı : {0}", toplam20lik.ToString());
            Console.ReadLine();
        }
    }
}
 
Son düzenleme:
Katılım
17 Haziran 2008
Mesajlar
1,840
Excel Vers. ve Dili
Microsoft Ofis Profesyonel 2019 x64 TR
Altın Üyelik Bitiş Tarihi
26-03-2020
İnternetten bulduğum kodları uyarladım.

C#:
using System;
using System.Text.RegularExpressions;
namespace regex
{
    class Program
    {
        static void Main(string[] args)
        {

            Regex rgx15 = new Regex(@"15\sluk\sduvar\s:\s(.*)\sm²");
            Regex rgx20 = new Regex(@"20\sluk\sduvar\s:\s(.*)\sm²");

            string[] tests = { "15 luk duvar : 1.17 m²", "15 luk duvar : 4.81 m²", "15 luk duvar : 7.67 m²",
                "15 luk duvar : 7.8 m²", "15 luk duvar : 10.4 m²", "15 luk duvar : 3.51 m²",
                "15 luk duvar : 4.42 m²", "15 luk duvar : 15.6 m²", "20 luk duvar : 15.34 m²",
                "20 luk duvar : 15.34 m²", "20 luk duvar : 30.94 m²", "20 luk duvar : 30.94 m²" , "25 luk duvar : 30.94 m²"};
            double toplam15lik=0;
            double toplam20lik=0;

            foreach (string test in tests)
            {
                if (rgx15.IsMatch(test))

                    foreach (Match m in rgx15.Matches(test))
                    {
                        toplam15lik += double.Parse(m.Groups[1].ToString ());
                        Console.WriteLine("15 lik : " + m.Groups[1]);
                    }
                else if (rgx20.IsMatch(test))

                    foreach (Match m in rgx20.Matches(test))
                    {
                        toplam20lik += double.Parse(m.Groups[1].ToString());
                        Console.WriteLine("20 lik : " + m.Groups[1]);
                    }
                else
                    Console.WriteLine("{0} 2 duruma da uymayan veri", test);
            }

            Console.WriteLine("15 lik duvar toplamı : {0}", toplam15lik.ToString() );
            Console.WriteLine("20 lik duvar toplamı : {0}", toplam20lik.ToString());
            Console.ReadLine();
        }
    }
}
Hocam ;

Bana sadece regex deseni lazım.

Oda tek olacak . Ama iki grup . Şeklinde ... bu şekilde iki regex bende yaptım . Ben bunları tek regex de birleştirip sonuç almak istiyorum . Olursa...
 
Katılım
17 Haziran 2008
Mesajlar
1,840
Excel Vers. ve Dili
Microsoft Ofis Profesyonel 2019 x64 TR
Altın Üyelik Bitiş Tarihi
26-03-2020
@veysel Emre

Bu iki kodu birleştirip Grup-1, Grup-2 şeklinde ayırabilirsem. Çok süper olur.

C#:
Regex rgx15 = new Regex(@"15\sluk\sduvar\s:\s(.*)\sm²");
Regex rgx20 = new Regex(@"20\sluk\sduvar\s:\s(.*)\sm²");

Akşama Kodları deneyeceğim.


Çalışma için Çok Teşekkür ederim.
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,302
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Alternatif (VBA);

C++:
Sub Test()
'   Haluk - 12/08/2021
'   sa4truss@gmail.com
    Dim arrPattern(1 To 2) As String
    Dim mySum As Double
  
    myStr = "15 luk duvar : 1.17 m², 15 luk duvar : 4.81 m², 15 luk duvar : 7.67 m² " & _
            "15 luk duvar : 7.8 m², 15 luk duvar : 10.4 m², 15 luk duvar : 3.51 m² " & _
            "15 luk duvar : 4.42 m², 15 luk duvar : 15.6 m², 20 luk duvar : 15.34 m² " & _
            "20 luk duvar : 15.34 m², 20 luk duvar : 30.94 m², 20 luk duvar : 30.94 m² "

    arrPattern(1) = "(15\sluk\sduvar\s:\s)([\d.]+)\sm²"
    arrPattern(2) = "(20\sluk\sduvar\s:\s)([\d.]+)\sm²"
        
    Set regExp = CreateObject("VBScript.RegExp")
  
    regExp.Global = True
  
    For Each xData In arrPattern
        regExp.Pattern = xData
        Set RetVal = regExp.Execute(myStr)
        mySum = 0
        For i = 0 To RetVal.Count - 1
            mySum = mySum + Val(RetVal(i).Submatches(1))
        Next
        MsgBox "Toplam " & RetVal(0).Submatches(0) & mySum & " m²"
    Next
End Sub
.
 
Son düzenleme:
Katılım
17 Haziran 2008
Mesajlar
1,840
Excel Vers. ve Dili
Microsoft Ofis Profesyonel 2019 x64 TR
Altın Üyelik Bitiş Tarihi
26-03-2020
@Haluk


Kod için teşekkürler. Sizin örnek patern ve @veyselemre patern ikisini de denedim. bir türlü birlestirip, Tek bir regex deseni elde edemedim... Bir de kodlar C# olacak hocam.
 

veyselemre

Özel Üye
Katılım
9 Mart 2005
Mesajlar
3,591
Excel Vers. ve Dili
Pro Plus 2021
C#:
using System;
using System.Text.RegularExpressions;
namespace regex
{
    class Program
    {
        static void Main(string[] args)
        {

            Regex rgx = new Regex(@"15\sluk\sduvar\s:\s(.*)\sm²|20\sluk\sduvar\s:\s(.*)\sm²");

            string[] tests = { "25 luk duvar : 30.94 m²", "15 luk duvar : 1.17 m²", "15 luk duvar : 4.81 m²", "15 luk duvar : 7.67 m²",
                "15 luk duvar : 7.8 m²", "15 luk duvar : 10.4 m²", "15 luk duvar : 3.51 m²",
                "15 luk duvar : 4.42 m²", "15 luk duvar : 15.6 m²", "20 luk duvar : 15.34 m²",
                "20 luk duvar : 15.34 m²", "20 luk duvar : 30.94 m²", "20 luk duvar : 30.94 m²" };
            double toplam15lik = 0;
            double toplam20lik = 0;

            foreach (string test in tests)
            {
                if (rgx.IsMatch(test))
                {
                    foreach (Match m in rgx.Matches(test))
                    {
                        if (m.Groups[1].ToString()!="")
                        {
                            toplam15lik += double.Parse(m.Groups[1].ToString());
                            Console.WriteLine("15 lik : " + m.Groups[1]);
                        }
                        else
                        {
                            toplam20lik += double.Parse(m.Groups[2].ToString());
                            Console.WriteLine("20 lik : " + m.Groups[2]);
                        }
                    }
                }
                else
                {
                    Console.WriteLine("{0} 2 duruma da uymayan veri", test);
                }
            }
            Console.WriteLine("15 lik duvar toplamı : {0}", toplam15lik.ToString());
            Console.WriteLine("20 lik duvar toplamı : {0}", toplam20lik.ToString());
            Console.ReadLine();
        }
    }
}
 
Son düzenleme:
Katılım
17 Haziran 2008
Mesajlar
1,840
Excel Vers. ve Dili
Microsoft Ofis Profesyonel 2019 x64 TR
Altın Üyelik Bitiş Tarihi
26-03-2020
@veyselemre

Hocam çok Teşekkür ederim. Tamamdır. Kod yapısını sizin göndermiş olduğunuz örnekteki gibi değiştirdim . Elinize sağlık.


-------------------- ;



Regex rgx = new Regex(@"15\sluk\sduvar\s:\s(.*)\sm²|20\sluk\sduvar\s:\s(.*)\sm²");


Sadece Regex birleşmiş halini kullandığımda benim mevcut kodlarda iken hata veriyor... yani... , Boş kısımlara denk geliyor... halbuki iki grup oluşuyor ama,, hata veriyor.

* Bu siteden test ediyorum iki grup oluşuyor.

 

veyselemre

Özel Üye
Katılım
9 Mart 2005
Mesajlar
3,591
Excel Vers. ve Dili
Pro Plus 2021
VBA uygulaması da aşağıdaki gibi örnek olsun.

Kod:
Sub test()
    Dim mySum1 As Double, mySum2 As Double, st As Variant
    With CreateObject("VBScript.RegExp")
        .Global = True
        .pattern = "15\sluk\sduvar\s:\s(.*)\sm²|20\sluk\sduvar\s:\s(.*)\sm²"

        For Each st In Split("15 luk duvar : 1.17 m², 15 luk duvar : 4.81 m², 15 luk duvar : 7.67 m², " & _
                             "15 luk duvar : 7.8 m², 15 luk duvar : 10.4 m², 15 luk duvar : 3.51 m², " & _
                             "15 luk duvar : 4.42 m², 15 luk duvar : 15.6 m², 20 luk duvar : 15.34 m², " & _
                             "20 luk duvar : 15.34 m², 20 luk duvar : 30.94 m², 20 luk duvar : 30.94 m² ", ",")

            With .Execute(Trim(st))
                mySum1 = mySum1 + .Item(0).submatches(0)
                mySum2 = mySum2 + .Item(0).submatches(1)
            End With

        Next

    End With

    MsgBox mySum1 & vbCr & mySum2

End Sub
 
Son düzenleme:

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,302
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Tek bir "pattern" kullanılması şartsa, 5 No'lu mesajımdaki VBA kodu aşağıdaki gibi revize edilebilir;

C++:
Sub Test2()
'   Haluk - 12/08/2021
'   sa4truss@gmail.com

    Dim myStr As String, regExp As Object
    Dim mySum1 As Double, mySum2 As Double

    myStr = "15 luk duvar : 1.17 m², 15 luk duvar : 4.81 m², 15 luk duvar : 7.67 m² " & _
            "15 luk duvar : 7.8 m², 15 luk duvar : 10.4 m², 15 luk duvar : 3.51 m² " & _
            "15 luk duvar : 4.42 m², 15 luk duvar : 15.6 m², 20 luk duvar : 15.34 m² " & _
            "20 luk duvar : 15.34 m², 20 luk duvar : 30.94 m², 20 luk duvar : 30.94 m² "

    Set regExp = CreateObject("VBScript.RegExp")

    regExp.Global = True

    regExp.Pattern = "(15\sluk\sduvar\s:\s)([\d.]+)\sm²|(20\sluk\sduvar\s:\s)([\d.]+)\sm²"
   
    Set RetVal = regExp.Execute(myStr)
   
    For i = 0 To RetVal.Count - 1
        mySum1 = mySum1 + Val(RetVal(i).submatches(1))
        mySum2 = mySum2 + Val(RetVal(i).submatches(3))
    Next
   
    MsgBox "Toplam " & RetVal(0).submatches(0) & mySum1 & " m²"
    MsgBox "Toplam " & RetVal(RetVal.Count - 1).submatches(2) & mySum2 & " m²"
End Sub
.
 
Katılım
17 Haziran 2008
Mesajlar
1,840
Excel Vers. ve Dili
Microsoft Ofis Profesyonel 2019 x64 TR
Altın Üyelik Bitiş Tarihi
26-03-2020
@veyselemre
@Haluk

Bu Regex konusunda yeniyim... Güzel bir konu...

Arkadaşlar yanıtlar için Çok Teşekkür ediyorum. Elinize sağlık.
 
Üst