Forum » Programiranje » regex kombinacija negative, positive look behind ...
regex kombinacija negative, positive look behind ...
BRBR ::
string npr:
'črnikasti sitovec Schoenus nigricans'
... in taki stringi v tem smislu dalje
regex:
super, to mi najde natančno 'c S' del stringa. Zdaj pa bi rad zadel natančno tisti presledek vmes, brez 'c' in 'S'.
Če ma kdo kak mušter za to ?
'črnikasti sitovec Schoenus nigricans'
... in taki stringi v tem smislu dalje
regex:
[a-zšč] [A-Z]
super, to mi najde natančno 'c S' del stringa. Zdaj pa bi rad zadel natančno tisti presledek vmes, brez 'c' in 'S'.
Če ma kdo kak mušter za to ?
blackbfm ::
(?![a-zšč])\s(?=[A-Z])
?
edit: ni čist to to, tisti prvi del ni v redu..ampak če ti zadostuje potem ok
?
edit: ni čist to to, tisti prvi del ni v redu..ampak če ti zadostuje potem ok
Zgodovina sprememb…
- spremenilo: blackbfm ()
BRBR ::
edit: ni čist to to, tisti prvi del ni v redu...
Torej če se držim tega muštra .. in hočem poiskat drugi presledek, zadetek veljaven samo v drugi vrstici:
"Oxychilus draparnaudi "
"Oxychilus draparnaudi draparnaudi "
Tole deluje, in res , prvi del iz zgornjega odgovora (spodaj manjka) pa ne deluje.
^"\w+ \w+ (?=[^"])
Kaj pa ni ok v prvem delu regexa iz prvega odgovora, da bi tole delovalo ?
Never underestimate the power of idiots in large groups.
Zgodovina sprememb…
- spremenil: BRBR ()
MrBrdo ::
A to rabiš za replace? K drgač se ponavad ne zafrkavam z lookbehind ampak samo več subexpressionov naredim pa potem tistega vzamem ki me zanima. Ne vem pa če je kej počasneje tako
MrBrdo
BRBR ::
ja za replaca, 'subsp.' moram tamle vmes vrinit.
ja če bi se mi dalo , in če bi se splačalo programirat, pa je brezveze, mam samo en velik text file , pa en editor, ki fajn podpira regex.
samo več subexpressionov naredim
ja če bi se mi dalo , in če bi se splačalo programirat, pa je brezveze, mam samo en velik text file , pa en editor, ki fajn podpira regex.
Never underestimate the power of idiots in large groups.
Spura ::
Tole je cist nerazumljivo napisano. Pojma nimam kaj hoces, kaj dela in kaj ne dela.
edit: ni čist to to, tisti prvi del ni v redu...
Torej če se držim tega muštra .. in hočem poiskat drugi presledek, zadetek veljaven samo v drugi vrstici:
"Oxychilus draparnaudi "
"Oxychilus draparnaudi draparnaudi "
Tole deluje, in res , prvi del iz zgornjega odgovora (spodaj manjka) pa ne deluje.
^"\w+ \w+ (?=[^"])
Kaj pa ni ok v prvem delu regexa iz prvega odgovora, da bi tole delovalo ?
BRBR ::
1. če sprobaš tole: '^"\w+ \w+ (?=[^"])' pozem ti najde (skupaj z zadnjim presledkom za bold)
"Oxychilus draparnaudi "
"Oxychilus draparnaudi draparnaudi "
2. če po zgornjem muštru naredmim, s ciljem da mi najde samo zadnji presledek za boldom:
'(?!^"\w+ \w+) (?=[^"])'
ne dela.
"Oxychilus draparnaudi "
"Oxychilus draparnaudi draparnaudi "
2. če po zgornjem muštru naredmim, s ciljem da mi najde samo zadnji presledek za boldom:
'(?!^"\w+ \w+) (?=[^"])'
ne dela.
Never underestimate the power of idiots in large groups.
Zgodovina sprememb…
- spremenil: BRBR ()
Spura ::
Seveda da ne. Zakaj preprosto ne capturas drugega presledka? Aja, ne mores grup uporabljat, ampak mora cel match bit presledek? Tezka bo.
Namrec razlog zakaj ti to ne dela je , da regex znotraj prvega negative lookahead izraza pade na vsakem znaku po prvem, torej naslednji znaki so kot da tega ne bi bilo.
Torej za prvi znak je ^"\w+ \w+ true, torej je (?!....) false, kar pomeni da match takoj pade in gre naprej na naslednji znak. Za naslenje znake je obratno, (?!....) je vedno true, kar pomeni da je isto kot bi imel samo ' (?=[^"])'. To seveda matcha vse presledke razen zadnjega pred ".
Kar bi ti moral naredit je uporabit positive lookbehind.
'(?<=^"\w+ \w+) (?=[^"])'
Torej, ce je pred to tocko, "beseda beseda, potem poskusi matchat space. Ampak tudi to ne bo delalo ker lookbehind me sme vsebovati izrazov, ki lahko matchajo poljubno veliko znakov (to je \w+ v tvojem primeru). Vsaj v vecini regex enginov ne.
Tko da si v riti.
Namrec razlog zakaj ti to ne dela je , da regex znotraj prvega negative lookahead izraza pade na vsakem znaku po prvem, torej naslednji znaki so kot da tega ne bi bilo.
Torej za prvi znak je ^"\w+ \w+ true, torej je (?!....) false, kar pomeni da match takoj pade in gre naprej na naslednji znak. Za naslenje znake je obratno, (?!....) je vedno true, kar pomeni da je isto kot bi imel samo ' (?=[^"])'. To seveda matcha vse presledke razen zadnjega pred ".
Kar bi ti moral naredit je uporabit positive lookbehind.
'(?<=^"\w+ \w+) (?=[^"])'
Torej, ce je pred to tocko, "beseda beseda, potem poskusi matchat space. Ampak tudi to ne bo delalo ker lookbehind me sme vsebovati izrazov, ki lahko matchajo poljubno veliko znakov (to je \w+ v tvojem primeru). Vsaj v vecini regex enginov ne.
Tko da si v riti.
BRBR ::
he,he, nisem v riti. Tole tvoje čudo dela:
menda je super duper regex jgsoftengine, ki je vgrajen v edit pad pro
--> tule na dnu je link, .... povezava
Hvala lepa.
'(?<=^"\w+ \w+) (?=[^"])'
menda je super duper regex jgsoftengine, ki je vgrajen v edit pad pro
--> tule na dnu je link, .... povezava
Hvala lepa.
Never underestimate the power of idiots in large groups.
Zgodovina sprememb…
- spremenil: BRBR ()
MrBrdo ::
Te lookbehindi so itak eno čudo Verjetno edina stvar v regexp ki mi nikoli ni bila čisto kristalno jasna, se jim zelo rad ognem...
MrBrdo
Spura ::
Look aheadi in look behindi so 0-width assertions. Torej regex matcha v neki tocki med dvema znakoma (sirina 0), ce drzi assertion.
Torej (?<=a)b mathca b v ab, ker lookbehind drzi v tocki med a in b, cemur sledi b, ki matcha izraz, ki sledi lookbehindu.
Torej (?<=a)b mathca b v ab, ker lookbehind drzi v tocki med a in b, cemur sledi b, ki matcha izraz, ki sledi lookbehindu.
MrBrdo ::
No hvala, zdej mi je še manj jasno
Sej drugače jih znam uporabljat, hotel sem rečt da mi je neprijetno in se jim raje izogibam, ker mi ponavadi nikoli ne dela s prve
Sej drugače jih znam uporabljat, hotel sem rečt da mi je neprijetno in se jim raje izogibam, ker mi ponavadi nikoli ne dela s prve
MrBrdo
Zgodovina sprememb…
- spremenilo: MrBrdo ()
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Python separiranje besed v stavkihOddelek: Programiranje | 1167 (981) | Meizu |
» | branje iz datoteke c#Oddelek: Programiranje | 1641 (1370) | darkolord |
» | PHP - stringiOddelek: Izdelava spletišč | 1785 (1608) | pehape |
» | java in regexOddelek: Programiranje | 1157 (1102) | alesrosina |