Merhaba arkadaşlar. Mesela bir kaynak kodunda geçen kelimenin hangi tagda olduğunu almak istiyorum. Şöyle bi pattern yazdım.

<(?<tag>(?i)(.+?))>.*kelime.*</\\k<tag>> //  \\k dan önce 2 tane \\ çıkıyor 1 tane olacak

bu pattern ile alabiliyorum fakat takıldığım nokta şu: İç içe tag olduğunda baştan itibaren alıyor. Yani

<p> Merhaba Dünya <a href="">Deneme</a><p>

yazdım ve ben deneme kelimesinin tagını bulmak istiyorum diyelim

<(?<tag>(?i)(.+?))>.*deneme.*</\\k<tag>> yazdığımda p tagından itibaren seçiyor. Normalde iç içeyse a tagını almasını istiyorum. Nasıl yapabilirim ?

Düzenleme : Test için Regex Testeri kullanabilirsiniz.

Teşekkürler

Not : Bazı regex farklılıkları için söylüyüm, c# da yazıyorum..

soruldu: 22 Şub '13, 02:06

creseos's gravatar image

creseos
2.0k468187
cevap kabul oranı: 37%

değiştirildi: 22 Şub '13, 05:44

Çalışan kodlarınızı test yaptıgınız siteye ekleyebilir misiniz?

(22 Şub '13, 02:31) AliRıza Adıyahşi ♦ AliR%C4%B1za%20Ad%C4%B1yah%C5%9Fi's gravatar image

Çalışan kodlar derken html kodlarını kastediyorsanız herhangi bir sitenin kaynak kodu üzerinden gidebilirsiniz.

(22 Şub '13, 02:36) creseos creseos's gravatar image
1

HttpParser kütüphanesi kullanıp, html ile uğraşmaktansa c# objeleri ile uğraşmak daha kolay olur. Sayfa içinde parser ile dolanıp, istediğiniz kelimeyi yakaladığınızda bir if kontrolü yapıp, hangi http bileşeni olduğunu bulursunuz.

(22 Şub '13, 03:25) Turgay Can Turgay%20Can's gravatar image

Cevaplarınız için teşekkürler fakat, bakın ben tek kelimeden bahsetmiyorum. Sayfanın içindeki tüm kelimelerin tagını alacağım. Eğer 1000 kelime varsa her biri için ayrı ayrı döngüye girip mi arıyım ?

(22 Şub '13, 03:39) creseos creseos's gravatar image

Yani başka türlü nasıl olabilir düşünelim? Burada lineer bir yaklaşım sergilersek, olayı şöyle basitleştirebilirsin. Sen httpparser ile sayfa içindeki bütün text'leri hangi objeler içinde ise bir List içine doldurup, daha sonrada logaritmik bir şekilde List içinde kelimelerri arama yaptırabilirsin(binary search logaritmik bir yaklaşım gösteriyor hatırladığım akdarıyla).

(22 Şub '13, 03:46) Turgay Can Turgay%20Can's gravatar image

Şu şekilde yapsam mesela ?

    private string tagBul(string kelime)
    {
        string tag = "-";
        string pattern = "<(?<tag>(?i)(.+?))>.*(>" + kelime +".*</\\k<tag>>";
        Match m = Regex.Match(kaynak, pattern, RegexOptions.IgnoreCase);
        tag = m.Groups[1].Value.ToString();
        return tag;
    }
(22 Şub '13, 03:50) creseos creseos's gravatar image
6 yorumdan 5 tanesi gösteriliyor hepsini göster

Merhabalar şu regexin işini görmesi gerek:

    String line = "<p> Merhaba Dünya <a href=\\"\\">Deneme</a><p>";
    Pattern pattern = Pattern.compile("(<[^>]+>)Deneme(<.+?>)");
    Matcher matcher = pattern.matcher(line);

    while(matcher.find()){
    System.out.println(matcher.group(1));
    System.out.println(matcher.group(2));
    }

Eşleşmeler sağlandı. Yaptıgın hata sen bunu yazdıgında <.+> ordaki . karakteri bunlada ">" eşleşiyor eşlesince devam edior tekrar bunu gördügün de > kısaca bunla eşleşiyor birinci grubun == < p > Merhaba Dünya < a href=" "> nedeni ise cok basit . p ile eşleşti sonra > bunla eşleşti ee gitti gitti en son > yine bunla eşleşti en büyügü bulmaya calısır regex bu yüzden [^>] kullanarak onla eşleşmesini kapamalısın. Deneme yerine istediğin kelimeyi yazabilirsin tabiki :)

permanent link

cevaplandı: 24 Şub '13, 08:02

melihbaba's gravatar image

melihbaba
2015812
cevap kabul oranı: 25%

değiştirildi: 24 Şub '13, 08:09

Cevabınız için Teşekkürler oluyor fakat ben burdan tagı nasıl alıcam grupla? Yani <p></p>

ise normal de <p id="a">Deneme</p>

ise normal değil. Yani başlangıç tagında boşluğa kadar alan bir grup oluşcak boşluk olabilir de olmayabilir de(Hem split işlemleri yapmamak için hem de açılan taga göre kapanışı bulmak için soruyorum) Ayrıca bu pattern ile

<td><a href="/wiki/Ottawa" title="Ottawa">Test Deneme 123</a><br />

Denediğimde almıyor çünkü tek deneme yok yani.

<td><a href="/wiki/Ottawa" title="Ottawa">Deneme</a><br />

olursa alıyor. kelimenin başna sonuna.* koyuyorum. Tümünü alıyor

(25 Şub '13, 01:12) creseos creseos's gravatar image

Sanırım benim yazdığım patternde de tümünü alması kelimenin başına ve sonuna yazdığım ".*" karakterlerinden kaynaklanıyor. Kelime kısmını da başını buraya kadar "<" sonunu ">" buraya kadar al olarak nasıl ayarlarız acaba ?

(25 Şub '13, 01:33) creseos creseos's gravatar image

merhaba sorunun 1. kısmını birçok kez okumama rağmen anlamadım ancak 2. kısımda sanırım şey soruosn içinde deneme gecmesi yeterli sadece deneme olmak zorunda deil onu böyle saglayabilirsn : Pattern pattern = Pattern.compile("(<[^>]+>)(?:[\\w\\s]Deneme[\\w\\s])(<.+?>)");

(25 Şub '13, 05:41) melihbaba melihbaba's gravatar image

[\\w\\s] lerden sonra yıldız var yorumda cıkmıyor habern olsn

(25 Şub '13, 05:42) melihbaba melihbaba's gravatar image

2.verdiğiniz pattern gayet güzel çalışıyor Teşekkür ederim. Ben tagı gruplamayı deniyim olmazsa split ile tag ismini alırım. Tekrar teşekkür ediyorum ilginiz için

sağolun iyi çalışmalar

(25 Şub '13, 06:31) creseos creseos's gravatar image

1.Soruda grup ile tag ismini nasıl alacağımızı sormuştum. Mesela benim patternime bakarsanız tag kısmına grup ismi veridm. Hem erişmek için hem de açılan tagın kapandığı yeri bulmak için. Mesela

<a href="www">Test Deneme 123</a> burada regex ile grup yeri belirtip bunu kullanabiliyorsunuz. Yani değişken gibi. Örneğin: <(?<tag>(?i)(.+?))> burada < ile > arasındaki değeri tag isimli bi gruba atadım sonunda da > diyeerek aldığım değeri kullandım. Onu demek istemiştim.

(25 Şub '13, 06:32) creseos creseos's gravatar image
6 yorumdan 5 tanesi gösteriliyor hepsini göster

genel olarak aradığınız regular expression ifadeleri buradan aratabilirsiniz.

permanent link

cevaplandı: 27 Şub '13, 15:26

ercet00ilk's gravatar image

ercet00ilk
984435662
cevap kabul oranı: 11%

Teşekkürler

(28 Şub '13, 00:50) creseos creseos's gravatar image
Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×238
×2

Soruldu: 22 Şub '13, 02:06

Görüntüleme: 1,526 kez

Son güncelleme: 28 Şub '13, 00:50

powered by BitNami OSQA