Regex, zczytywanie do końca linii

0

Witam. Mam taki problem.
Posługuję się regexem, chcę znaleźć wszystkie wystąpienia pewnego słowa w tekście. I znajduję :)
Ale chciałbym żeby regex czytał mi resztę linijki od momentu gdzie te słowo się znajduje., np.

Ala ma kota i kot waży 6 kg + to co zje.

szukane słowo to : "ma" i teraz chciałbym w wyniku uzyskać:
ma kota i kot waży 6 kg + to co zje.

Z góry dzięki za pomoc.

0
Regex regex = new Regex("(ma.*)");

Jednak jeżeli jest to na tyle prosty przykład, lepiej będzie pobawić się IndexOf i Substring.

0

erm.. doslownie biorac, slowo plus reszta linijki to: slowo.*?$ - bez kotwicy, jesli bedzie tekst wieloliniowy, regex moze zlapac wszystko, nie tylko do \n

0

Domyślnie Regex działa w ten sposób, że kropka oznacza wszystko prócz znaku nowej linii.

0

W domyślnym trybie (singleline) łańcuch jest przerabiany pojedynczymi czyli tak jakby łańcuch był podzielony na linie i na każdej z osobna był wywołany regex. Żadna linia nie może zawierać znaku nowej linii, więc kropka go nie może złapać. Znaki ^ i $ oznaczają początek i koniec linii.
W trybie multiline znak nowej linii jest traktowany jak każdy inny znak biały, a ^ i $ oznaczają początek i koniec całego łańcucha.

0

@adf88 - w "standardzie" - krotko: ^ to poczatek, $ to koniec wejscia.. natomiast spotkalem sie z silnikiem, dla ktorego $ i \n znaczyly to samo, wydawalo mi sie ze to byl .netowy wlasnie.. nie sprawdzilem przed odpisaniem, moj blad

0

Witam podepnę się pod posta.
Powiedzcie mi jak zczytać do stringa kilka linijek zaczyna się od a kończy na </li>
są tam też znaki końca linii.

to nie działa
Regex reg = new Regex("clear_li\">(.*)</li>", RegexOptions.Multiline);

1
new Regex("<li class=\"clear_li\">(.*)</li>", RegexOptions.Multiline);

?

0

niestety to to samo co ja wkleiłem tylko obciąłem trochę początek.
macie jakieś inne pomysły ??
Mi się wydaję ze jest kłopot z końcem linii

0

Mozesz sprobowac z czyms takim:

new Regex("<li\\s+class\\s*=\\s*\"clear_li\"\\s*>([^<]*)</li>", RegexOptions.Multiline);
0

msm - zapomniales o @ przed stringiem

0

Podłącze się do tematu bo też mam problem z odzworowaniem znaku końca linii w wyrażeniu regularnym.
w pliku o formacie m.in. takim:

1    fgj23mdjvi4da    Nazwa Towaru w systemie ERP    65    0    00%    65    100    szt       6500
                            Nazwa Rozszerzona 1                    
2    dmajb93nakeib    Normalna Nazwa    12    0    00%    12    20    szt    240
                                    
3    3ngkanflow96n    Dziwna 328x, nazwa    76    0    00%    76    30    szt    2280
                                    
4    gmalburkaje92    Wyrob z grupy o stalej dlugosci nazwy    385    0    00%    385    20    szt    7
                            Nazwa rozszerzona 2                    
5    fjka73mpoa825    Wyrob-o-takiej-nazwie    5    0    00%    5    5    szt    25
                                    
6    dk239gmajkwo3    Jakis wyrob 6    5    0    00%    5    1    szt    5
 

szukam linii pozycji zamówienia takim wyrażeniem:

string wzorzecTestowy = @"(?<Lp>\d{1,3})\t(?<Index>.{10,25})\t(?<NazwaH>.+?)\t(\d{1,5})\t(\d+?)\t(\d{2}%)\t(\d+)\t(?<Ilosc>\d+)\t(?<jm>.{1,3})\t(\d+)(?<NazwaS>.*?$)"; 

ale w tej formie wszystkie grupy są rozpoznawane prawidłowo oprócz grupy NazwaS, tu wartość sczytana wychodzi mi string = "";

Dla takiego wyrażenia:

string wzorzecTestowy = @"(?<Lp>\d{1,3})\t(?<Index>.{10,25})\t(?<NazwaH>.+?)\t(\d{1,5})\t(\d+?)\t(\d{2}%)\t(\d+)\t(?<Ilosc>\d+)\t(?<jm>.{1,3})\t(\d+).*?$(?<NazwaS>).+?";

Zwracany jest pusty MatchCollection w metodzie OdszukajWDokumencieZbior(string wzorzecRegex).

Tworzenie wyrażenia mam zrobione tak:

        private MatchCollection OdszukajWDokumencieZbior(string wzorzecRegex)
        {            
            if (!String.IsNullOrEmpty(ZawartoscOdczytanegoPliku))
            {
                return Regex.Matches(zawartoscOdczytanegoPliku, wzorzecRegex, RegexOptions.Multiline);
            }
        }

        public void UstawListePozycjiZamowienia()
        {
            MatchCollection wynikRegex = OdszukajWDokumencieZbior(wzorzecTestowy);

            if (wynikRegex != null && wynikRegex.Count != 0)
            {
                for (int i = 0; i < wynikRegex.Count; i++)
                {
                    PozycjaZamowienia nowa = new PozycjaZamowienia();
                    nowa.NrPozycji = Int32.Parse(wynikRegex[i].Groups["Lp"].Value);
                    nowa.IndexERP = wynikRegex[i].Groups["Index"].Value;
                    nowa.NazwaHandlowa = wynikRegex[i].Groups["NazwaH"].Value;
                    nowa.Ilosc = Int32.Parse(wynikRegex[i].Groups["Ilosc"].Value);
                    nowa.Jm = wynikRegex[i].Groups["jm"].Value;
                    nowa.NazwaSprzedazowa = wynikRegex[i].Groups["NazwaS"].Value.Trim();

                    zo.DodajPozycjeDoZamowienia(nowa);
                }
            }

        }

Nie wiem jak prawidłowo odczytać z pliku tą nazwę rozszerzoną pozycji zamowienia, ktora jest w kolejnej linii za linią pozycji zamowienia.
Nie wiem jak prawidlowo zdefiniować wyrażenie regularne określające to, że spodziewany ciąg znaków jest po__ jednym znaku__ końca linii i po powrocie karetki po określonej ilości tabulacji.
Próbowałem wszyć w wyrażenie regularne znaki \n\r ale wtedy metoda private MatchCollection OdszukajWDokumencieZbior(string wzorzecRegex), zwraca pusty obiekt MatchCollection.

EDIT:
Dla takiego RegEx:

 string wzorzecTestowy = @"(?<Lp>\d{1,3})\t(?<Index>.{10,25})\t(?<NazwaH>.+?)\t(\d{1,5})\t(\d+?)\t(\d{2}%)\t(\d+)\t(?<Ilosc>\d+)\t(?<jm>.{1,3})\t(\d+)\s*?$\s(?<NazwaS>.+?)";

grupa NazwaS również zwraca "".

0

Zaczynam kolejny tydzień, kolejnym dniem świra, sam sobie odpowiadam:

dla porzadku daje rozwiązanie, pomogło wyrażenie:

@"(?<Lp>\d{1,3})\t(?<Index>.{10,25})\t(?<NazwaH>.+?)\t(\d{1,5})\t(\d+?)\t(\d{2}%)\t(\d+)\t(?<Ilosc>\d+)\t(?<jm>.{1,3})\t(\d+)\s*?$\s(?<NazwaS>.*?$)" 

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