[C#] Problem ze slashem w REGEX

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

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?

0

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

            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 ?

0
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?

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.

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:

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();
            }
        }
    }
}

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.

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

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 ().

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"?

1 użytkowników online, w tym zalogowanych: 0, gości: 1