none
c# Regex RRS feed

  • Soru

  • Merhaba
    Konu "System.Text.RegularExpressions" kütüphanesinin kullanımı.
    Aşağıdaki metin dosyasından altyazı numarası ve bir altındaki süresi hariç sadece altyazı cümlelerini ayıklamak istiyorum.

    bunun regex kodunu çözemedim. Yardımcı olursanız sevinirim.

    Süreleri almak için şu deseni kullandım.
    Başlangıç süresi:
    ^[0-9][0-9][:][0-9][0-9][:][0-9][0-9][,][0-9]*

    Bitiş Süresi:
    [0-9][0-9][:][0-9][0-9][:][0-9][0-9][,][0-9]*$


    ynstek

    27 Mart 2016 Pazar 21:28

Tüm Yanıtlar

  • (\d\d:.*,\d\d\d)|([0-9]{1,5})\n /g

    bununla tüm rakamları silebilirsin. 

    Bir başka yaklaşımda rakamla başlamayan satırları bulmak olabilir.

    28 Mart 2016 Pazartesi 06:21
  • Su verileri resim olarak verme hastaligi cok kotu, yoksa kod ile de yardim ederdik :(

    Sahsi fikrim, buradaki asil desen, 4'er satirlik gruplarin olmasi ve senin surekli belli satirlari almak istemen. Bence bu  regular expression gerektirmiyor. Ornek:

    string ornek = @"satir1
    satir2
    satir3
    satir4
    
    satir11
    satir21
    satir31
    satir41
    
    satir12
    satir23
    satir33
    satir43";
    
    var data = ornek.Split('\n');
    string[,] sonuc = new string[(int)Math.Ceiling(data.Length / 5M), 5];
    
    for (int i = 0; i < data.Length; i++)
    {
    	sonuc[i / 5, i % 5] = data[i];
    }
    

    28 Mart 2016 Pazartesi 10:11
  • Hocam teşekkür ederim ama verdiğim kaynak sabit değil ve satır sayısı değişebiliyor. Çoğunlukla 3 satır ama 4-5 satır da olabiliyor

    ynstek

    28 Mart 2016 Pazartesi 10:57
  • (\d\d:.*,\d\d\d)|([0-9]{1,5})\n /g

    bununla tüm rakamları silebilirsin. 

    Bir başka yaklaşımda rakamla başlamayan satırları bulmak olabilir.


    Hocam teşekkür ederim kodu denicem fakat tüm rakamları silmek altyazılardaki rakamları da siler bu istemediğim bir durum. Verdiğim kaynak sadece örnek ve başında rakam olan altyazılar da olabiliyor

    ynstek

    28 Mart 2016 Pazartesi 11:00
  • Tüm rakamları derken sizin istediklerinizi kastetmiştim. "\n" parametresi rakamdan sonra yeni satırı kontrol ediyor. Güvenli olsun derseniz başında da bir \n koyabilirsiniz. böylece sadece ilk satırdaki 1 rakamını silmez.
    28 Mart 2016 Pazartesi 11:08
  • Anladim :) Ama anlamadigim tam olarak ne yapmaya calistigin. Soruyu anlayabilseydim ve elimde test edecek veri olsaydi baska ornek verebilirdim.
    28 Mart 2016 Pazartesi 11:16
  • Çetin bey,

    O resimdeki SRT formatında film altyazıları için kullanılan dosyadan bir resim. (txt bir dosya aslında)

    Formatı

    1. satır Konuşma numarası

    2. Satır film başladıktan sonra hangi saniyeler arasında görüneceği.

    3. Satır da altyazı metni.

    Sanırım soruyu soran çevirmenlik yapıyor. Aradaki diğer şeyleri temizleyip filmin konuşma metnini elde etmeye çalışıyor.

    Excel'de 10 saniyelik iş. Aç, a sutununa ilave yap ve otomatik numaralama yap, B'ye göre sırala, rakamları sil, a ya göre tekrar sırala. :)

    28 Mart 2016 Pazartesi 11:30
  • Valla sen anladiysan iyi :) Benim anladigim konusma metinlerini atip sira ve sureleri almak istedigiydi. Bak cok farkli anlamisiz. Oyle de olsa ana desen gruplar halinde yazilar, arada bos bir satir ayiriyor. Her grubun ilki sira, ikincisi sure, kalani sozler. RegExp'lik is olduguna emin olamadim :)
    28 Mart 2016 Pazartesi 11:34
  • Hocam bunu ben şu şekilde yapmıştım:
    ^[0-9][0-9][:][0-9][0-9][:][0-9][0-9][,][0-9]*.....[0-9][0-9][:][0-9][0-9][:][0-9][0-9][,][0-9]*$

    Siz kısaltmış oldunuz. Asıl istediğim bunu nasıl keseceğim? regex.replace i benim koda bir türlü yerleştiremedim. istediğim yerlere şu kodla listbox a aktarıyorum.

    string desen = @"(\d\d:.*,\d\d\d)|([0-9]{1,5})\n /g";
    //string TimeD = @"^[0-9][0-9][:][0-9][0-9][:][0-9][0-9][,][0-9]*.....[0-9][0-9][:][0-9][0-9][:][0-9][0-9][,][0-9]*$";
    //string noD = @"^[0-9]*$";
    //string fullD = @".*";
                    
    
                    Regex sub = new Regex(desen);
                    MatchCollection mC = sub.Matches(tmp);
                    foreach (Match m in mC)
                    {
                        if (m.ToString() != "")
                        {
                            listBox1.Items.Add(m);
                        }
                    }



    ynstek

    28 Mart 2016 Pazartesi 12:22
  • Sen hala yanlis yoldasin, benden soylemesi :)
    28 Mart 2016 Pazartesi 12:24
  • Sen hala yanlis yoldasin, benden soylemesi :)

    Hocam istediğim .srt dosyasındaki sadece altyazıları ayıklayıp listboxa aktarmak. (Daha sonra bunları kelimelere bölüp dizilere aktaracağım orası ayrı :)

    Bunu yapabileceğim bir yol gösterirseniz ne alâ :)


    ynstek

    28 Mart 2016 Pazartesi 12:37
  • Basindan beri soyluyorum, resim yerine gercek verinden yazi olarak verirsen (mesela ilk 5-10 tanesini), ve sonucta ne istedigini gosterirsen (hala anlamadim sen hangi satirlarin kalmasini istiyorsun) o zaman kod ornegi verebilirim. Hikaye seklinde soru ile anlasilmiyor, yazi yerine resim paylasmak isi daha da zorlastiriyor. 
    28 Mart 2016 Pazartesi 12:42
  • Basindan beri soyluyorum, resim yerine gercek verinden yazi olarak verirsen (mesela ilk 5-10 tanesini), ve sonucta ne istedigini gosterirsen (hala anlamadim sen hangi satirlarin kalmasini istiyorsun) o zaman kod ornegi verebilirim. Hikaye seklinde soru ile anlasilmiyor, yazi yerine resim paylasmak isi daha da zorlastiriyor. 
    Resim olarak vermem yanlış biliyorum ama boşluklar vs net görünsün diye resim atmıştım.
    Sorunu ise çözdüm :)
    Kaynak dosya içeriği şöyle:
    1
    00:00:00,360 --> 00:00:07,900
    Tek Kelime ile Harika!
    Hayata ve Eğlenceye Dair Ne Varsa!
    
    2
    00:00:08,480 --> 00:00:09,840
    Defol!!
    
    3
    00:00:12,140 --> 00:00:13,760
    Git Buradan!!!
    Seni Görmek istemiyorum
    
    4999
    00:00:38,440 --> 00:00:40,280
    Ne s... gülüyorsun!!
    
    5
    09:01:18,80 --> 00:01:21,100
    25 Bu kokuda ne?
    10th
    
    6
    00:01:26,520 --> 00:01:29,740
    Sen benim dükkanımın önüne ne cesaretle işersin!!
    

    Şu kod ile sadece aradaki altyazıları ayıkladım:
     string desen = @".*";
                    Regex sub = new Regex(desen);
                    MatchCollection mC = sub.Matches(tmp);
    
                    foreach (Match m in mC)
                    {
                        if (m.ToString() != "")
                        {
                            string a = Regex.Replace(m.ToString(), @"(\d\d:.*,\d\d\d)|([0-9]{1,5})\n /g", "\n");
                            a = Regex.Replace(a, @"^[0-9]*$", "");
                            if (a != "")
                            {
                                listBox1.Items.Add(a);
                            }
                        }
                    }

    İlginiz için teşekkür ederim.

    ynstek

    28 Mart 2016 Pazartesi 13:09
  • Sadece text satırları çekmek daha çok işine yarar.

    Regex rgx = new Regex(@"\n[^\d].*", RegexOptions.Compiled);
                string srt = File.ReadAllText(@"dosyayolu");
                foreach (var item in rgx.Matches(srt))
                {
                    Console.Write(item);
                } 
    fazla olan \n\r'leri de temizlersin.

    28 Mart 2016 Pazartesi 13:18
  • Evet simdiye kadar anlattiklarindan farkli bir sey istiyormussun:

    void Main()
    {
    	string tmp = @"1
    00:00:00,360-- > 00:00:07,900
    Tek Kelime ile Harika!
    Hayata ve Eğlenceye Dair Ne Varsa!
    
    2
    00:00:08,480-- > 00:00:09,840
    Defol!!
    
    3
    00:00:12,140-- > 00:00:13,760
    Git Buradan!!!
    Seni Görmek istemiyorum
    
    4999
    00:00:38,440-- > 00:00:40,280
    Ne s... gülüyorsun!!
    
    5
    09:01:18,80-- > 00:01:21,100
    25 Bu kokuda ne ?
    10th
    
    6
    00:01:26,520-- > 00:01:29,740
    Sen benim dükkanımın önüne ne cesaretle işersin!!";
    
    	string patternBasit = @"^\d[0-9:,]*--\s>\s[0-9:,]*\d$";
    	//string patternDetay = @"^\d{2}:\d{2}:\d{2}(,\d{1,3})?--\s>\s\d{2}:\d{2}:\d{2}(,\d{1,3})?$";
        var lines = tmp.Split('\n');
    	var bs  = lines
    		.Select((l, i) => new { line = l.Trim(), i })
    		.Where(l => Regex.IsMatch(l.line, patternBasit))
    		.Select(l => l.i - 1);
    
        // ben boyle anlamistim
    	//var lst = lines.Where((l,i) => !(string.IsNullOrEmpty(l.Trim()) || bs.Contains(i) || bs.Contains(i-1)));
    	var lst = lines.Where((l,i) => !bs.Contains(i-1));
    }
    

    28 Mart 2016 Pazartesi 13:33
  • Bu forumun adi

    "Sql Server Forumu"

    4 Mayıs 2016 Çarşamba 06:29