[C#] Problem ze slashem w REGEX

[C#] Problem ze slashem w REGEX
  • Rejestracja: dni
  • Ostatnio: dni
0

Witam,
Piszę program, w którym używam wyrażeń regularnych przy odczytywaniu z pliku tekstowego nazwy strony WWW i linku do niego. W takiej postaci (fragment pliku .txt) :

...
<Onet>[www.onet.pl]
<Sport>[www.sport.pl]
...

Mam następujący problem. Jeżeli adres WWW jest w powyższej postaci wszystko dziala ok, ale jeśli występuje w nim slash program się zawiesza. Tak wygląda mój obiekt klasy REGEX :

Regex myregex = new Regex(@"<(?<name>(\S+|\ )+)>" + @"[(?<www>(\S+|\ )+)]");

Ma ktoś jakiś pomysł jak rozwiązać ten problem ?

Pozdrawiam

msm
  • Rejestracja: dni
  • Ostatnio: dni
1

Wstawiałem slashe gdzie się da i program działa. Na moje oko zresztą tak samo - ten regex wygląda na poprawny. Może masz błąd gdzieś indziej?

  • Rejestracja: dni
  • Ostatnio: dni
0

U mnie nie działa, sprawdziłem na paru komputerach i nigdzie nie działa.
Wklejam fragment kodu, któr dodaje obiekty :

Kopiuj
            FileName = file_name;
            string txt = sr.ReadToEnd();
            sr.Close();
            Regex myregex = new Regex(@"\<(?<name>(\S+|\ )+)\>" + @"\[(?<www>(\S+|\ )+)\]");
            MatchCollection m = myregex.Matches(txt);
            int count = 0;
            count = m.Count;
            for(int i=0;i<m.Count;i++)
            {
                string name = m[i].Groups["name"].ToString();
                string www = m[i].Groups["www"].ToString();
                this.listBox1.Items.Add(new Receipe(name,www));
            }

Macie może jakieś pomysły co jest nie tak ?

aurel
  • Rejestracja: dni
  • Ostatnio: dni
0
Kopiuj
string name = m[i].Groups["name"].ToString();
string www = m[i].Groups["www"].ToString();

A mnie się wydaje, że w indeksie Groups powinny być liczby. No bo niby co to za indeks dla zwrotu wyrażenia regularnego "name"? Na co to według ciebie wskazuje?

msm
  • Rejestracja: dni
  • Ostatnio: dni
1

@aurel - pudło. To tzw. indekser. W indekserze równie dobrze mogą być chary, bajty, a nawet obiekty typu GraphicsPath - cokolwiek programista sobie zażyczy.

@filip - sprawdzę to.

msm
  • Rejestracja: dni
  • Ostatnio: dni
1

Jesteś pewien że to ten fragment zacina program? Może klasa Receipe np. działa błędnie kiedy otrzymuje slash?

Sprawdź wykonanie tego kodu:

Kopiuj
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string txt = @"
<Onet>[www.onet.pl]
<Sport>[www.sport.pl]
<Ala>[Ma /kota\]
";
            Regex myregex = new Regex(@"\<(?<name>(\S+|\ )+)\>" + @"\[(?<www>(\S+|\ )+)\]");
            MatchCollection m = myregex.Matches(txt);
            int count = 0;
            count = m.Count;
            for (int i = 0; i < m.Count; i++)
            {
                string name = m[i].Groups["name"].ToString();
                string www = m[i].Groups["www"].ToString();
            }
        }
    }
}

  • Rejestracja: dni
  • Ostatnio: dni
0

Witam, Panowie możecie rzucić okiem na mój kod. Problem tkwi w tym że działa błędnie, tzn match.Success jest zawsze False. W czym tkwi problem.

Kopiuj
string regex = "[ż|rz]ołnie[ż|rz]a";

var listaTestowa = new List<string> {"żołnierzyk", "żołnierza", "żołnierzyki"};
var listaKombinacji = new List<string>();               
                foreach (string slowo in listaTestowa)
                {
                    Match match = Regex.Match(slowo, regex);
                    if (match.Success)
                    {
                        listaKombinacji.Add(match.Groups[1].ToString());
                    }
                }

Nie mogę w żaden sposób uzyskać słowa "żołnierza". Może mój regex jest zły. Proszę o pomoc

ŁF
  • Rejestracja: dni
  • Ostatnio: dni
0

Nowy problem umieszczaj w nowym wątku, zamiast bawić się w nekrofilię.
Kwadratowe nawiasy oznaczają zbiór liter, w Twoim przypadku jedno ż, |, r lub z. To oznacza, że regex złapie żołnieża, rołnieza, ale nie rzołnieża i nie żołnierza. Prawidłowo będzie, jeśli zamiast [] dasz ().

  • Rejestracja: dni
  • Ostatnio: dni
0

Dzięki za pomoc. Następny problem na pewno znajdzie się w nowym wątku... A jeszcze wracając do znaku "|" to w moim wyrażeniu (ż|rz) znaczy "lub"?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.