Regulární výraz - pomoc s odladěním

Giovanna

Regulární výraz - pomoc s odladěním
« kdy: 25. 06. 2015, 19:01:55 »
Dobrý den,

mám jednořádkový textový řetězec, který je:

IP=10.73.135.255 // ***Server IP***

Dále mám odladěný regulární výraz:

^\s*IP=(\d+\.\d+\.\d+\.\d+)\s*\/\/\s\*\*\*Server\sIP\*\*\*\s*$

Pokud chci match tohoto jednoho řetězce, vše funguje.

Co ale nevím, když bude řetězec uprostřed souboru s nejrůznějšími dalšími přiřazeními, jak výraz upravit - řekněme, že požadovaný match bude někde uprostřed souboru.

Poradíte mi někdo, prosím?


Stalin

Re:Regulární výraz - pomoc s odladěním
« Odpověď #1 kdy: 25. 06. 2015, 19:19:41 »
Ja by som to upravil nejak takto:

<>*

Kolemjdouci

Re:Regulární výraz - pomoc s odladěním
« Odpověď #2 kdy: 25. 06. 2015, 19:23:59 »
Zkus nahradit ^ a $ znakem /

Giovanna

Re:Regulární výraz - pomoc s odladěním
« Odpověď #3 kdy: 26. 06. 2015, 01:56:00 »
Nakonec jsem odstranil ^ a $.

Děkuju všem.

Ještě jsem se chtěl zeptat, zda-li . NET mohu pomocí Regex.Replace změnit např.

IP=22.22.22.22 // ***Server IP***

na

IP=33.33.33.33 // ***Server IP***

Zkoušel jsem to ale vždy jsem místo požadované změny pouze adresy přemazal celý řádek. Výsledkem potom bylo nikoliv

IP=33.33.33.33 // ***Server IP***

nýbrž. pouze:

33.33.33.33 a to ještě s odstraněním newline, spojil jsem tedy tři řádky dohromady.

Používal jsem pro match výše uvedený regulární výraz.

Děkuju za jakýkoliv nápad či řešení.

Jetset

Re:Regulární výraz - pomoc s odladěním
« Odpověď #4 kdy: 26. 06. 2015, 09:55:39 »
vzhledem k tomu, ze matchnes cely radek, t.j. IP=22.22.22.22 // a tak dale, tak Replace bude nahrazovat cely radek.
Jelikoz je to IP= a poznamka na konci vzdycky stejna, tak bude stacit, kdyz to cele nahradis retezcem "IP=33.33.33.33 // ***Server IP***"
Proc to ovsem spojilo tri radky dohromady, s tim ti neporadim, to bude nejaky bug netu. Muzes to (snad) obejit tim, ze na zacatek a na konec nahrazujiciho retezce das \n.
Jinak by se to dalo jeste udelat takto (v SEDu):
s|^\(IP=\)[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\( // \*\*\*Server IP\*\*\*\)$|\133.33.33.33\2|
sekvence \1 a \2 zkopiruji do vysledku obsah toho, co je ve vzoru v zavorkach. Urcite pujde neco takoveho i v netu.



Giovanna

Re:Regulární výraz - pomoc s odladěním
« Odpověď #5 kdy: 28. 06. 2015, 21:43:20 »
Poslední dotaz,

musím třeba takový regexp jako:

Kód: [Vybrat]
Start -NoNewWindow ..\..\bin\Parent\servercmd.exe --masterIp 10.73.135.240 --masterPort 5045

psát a vyjmenovávat pomocí [a-z] atd. všechno možné? Kdesi jsem četl o greedy výrazech, a tušil jsem, že by se dalo číst až do výskytu žádaného, ale úplně jsem to nepochopil. Taková "masterIP" může na kterékoliv pozici a tak asi chápete, proč se ptám.

Děkuji
G.

Giovanna

Re:Regulární výraz - pomoc s odladěním
« Odpověď #6 kdy: 28. 06. 2015, 23:44:32 »
Dá se to, prosím, řešit pomocí regulárního výrazu a existuje taková escape sekvence, která by vše až do úspěšného výskytu vše ostatní ignorovala, nebo se mýlím?

Děkuji

Giovanna

Re:Regulární výraz - pomoc s odladěním
« Odpověď #7 kdy: 29. 06. 2015, 01:17:38 »
Napsal jsem si výraz :

::\s*\*\*\*IP\sAddress\*\*\*\nstart\s*.*\-\-\s*masterIP (\d+\.\d+\.\d+\.\d+).*

Online tester hlásí, že je správně, ale k matchi nedojde. Nechtěl jsem, aby to za mě někdo udělal: potřebuju mít v groupě ip adresu, ale nejde mi to. Ten komentář na začátku je navíc a v něm chyba není.

Pomůžete mi někdo prosím?
Děkuji

TTTTTTT

Re:Regulární výraz - pomoc s odladěním
« Odpověď #8 kdy: 29. 06. 2015, 02:00:51 »
Hádám, že spíš nepomůže, protože nikdo nevykoumá, co vlastně chceš.

Poslední dotaz,

musím třeba takový regexp jako:

Kód: [Vybrat]
Start -NoNewWindow ..\..\bin\Parent\servercmd.exe --masterIp 10.73.135.240 --masterPort 5045

psát a vyjmenovávat pomocí [a-z] atd. všechno možné? Kdesi jsem četl o greedy výrazech, a tušil jsem, že by se dalo číst až do výskytu žádaného, ale úplně jsem to nepochopil. Taková "masterIP" může na kterékoliv pozici a tak asi chápete, proč se ptám.

Ten příklad není regexp, ale spíš řetězec, který matchuješ. Zbytek dotazu nedává smysl bez toho, abys naznačil, co chceš udělat. Zřejmě nějaký regexp, který to namatchuje. Což je třeba ten řetězec s escapovanými speciálními znaky, ale to zřejmě nebude to, co chceš:

Kód: [Vybrat]
Start -NoNewWindow \.\.\\\.\.\\bin\\Parent\\servercmd.exe --masterIp 10\.73\.135\.240 --masterPort 5045


Napsal jsem si výraz :

::\s*\*\*\*IP\sAddress\*\*\*\nstart\s*.*\-\-\s*masterIP (\d+\.\d+\.\d+\.\d+).*

Online tester hlásí, že je správně, ale k matchi nedojde. Nechtěl jsem, aby to za mě někdo udělal: potřebuju mít v groupě ip adresu, ale nejde mi to. Ten komentář na začátku je navíc a v něm chyba není.

Uvedený regexp obsahuje Address, ten poslední (asi)vzor ne. Těžko říct, s čím to matchuješ. Zkus tedy položit dotaz znovu, tak aby tam byl vzorový text, popsané části, které se mění a které jsou pevné a regexp který na to zkoušíš namatchovat. Pokud napíšeš i o co se celkově snažíš, tak se možná dozvíš, že regexpy nejsou vhodně zvolený nástroj, ale jen hádám z těch útržků.


Giovanna

Re:Regulární výraz - pomoc s odladěním
« Odpověď #9 kdy: 29. 06. 2015, 02:24:10 »
Snažím se matchovat:

Kód: [Vybrat]
:: ***IP Adress***
Start -NoNewWindow ..\..\bin\Parent\servercmd.exe --masterIp 10.73.135.240 --masterPort 5045

pomocí výrazu:

Kód: [Vybrat]
::\s*\*\*\*\sIP\sAddress\s\*\*\*\nstart.*\-\-\s*masterIP\s(\d+\.\d+\.\d+\.\d+).*

Duvod, proc potrebuji regularni vyraz je ten, ze velicin v programu start je X a uživatel je snadno muze popřeházet.

Diky

ttt

Re:Regulární výraz - pomoc s odladěním
« Odpověď #10 kdy: 29. 06. 2015, 03:42:25 »
Tohle by snad mohlo projít.
Kód: [Vybrat]
^::\s*\*\*\*IP\sAdress\*\*\*\nStart.*\-\-masterIP\s(\d+\.\d+\.\d+\.\d+)
  • okolo IP Adress nejsou mezery, tedy tam nemá být \s
  • Adress vs Address
  • Start vs start
  • za -- zpravidla nesmí být mezera

Je-li to konfigurační soubor, pak by bylo lepší použít nějaký standardní formát. Na parsování argumentů jsou též lepší věci než regulární výrazy, minimálně ty takto lepené.

Giovanna

Re:Regulární výraz - pomoc s odladěním
« Odpověď #11 kdy: 29. 06. 2015, 21:46:52 »
Děkuju mnohokrát, nebylo třeba mnoho úprav.