Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Giovanna 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?
-
Ja by som to upravil nejak takto:
<>*
-
Zkus nahradit ^ a $ znakem /
-
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í.
-
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.
-
Poslední dotaz,
musím třeba takový regexp jako:
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.
-
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
-
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
-
Hádám, že spíš nepomůže, protože nikdo nevykoumá, co vlastně chceš.
Poslední dotaz,
musím třeba takový regexp jako:
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š:
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ů.
-
Snažím se matchovat:
:: ***IP Adress***
Start -NoNewWindow ..\..\bin\Parent\servercmd.exe --masterIp 10.73.135.240 --masterPort 5045
pomocí výrazu:
::\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
-
Tohle by snad mohlo projít.
^::\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é.
-
Děkuju mnohokrát, nebylo třeba mnoho úprav.