Soran
c# Regex

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
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.
- Yanıt Olarak Öneren Kyamuran SalibryamMicrosoft contingent staff, Moderator 28 Mart 2016 Pazartesi 09:22
-
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]; }
-
-
(\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 olabiliyorynstek
-
-
-
Ç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. :)
-
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 :)
-
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
-
-
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
-
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.
-
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.
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
-
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.
-
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)); }
-