» »

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:
[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])

?:P

edit: ni čist to to, tisti prvi del ni v redu..ampak če ti zadostuje potem ok

Zgodovina sprememb…

  • spremenilo: blackbfm ()

BRBR ::

Ja, hvala, deluje.

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.


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 ::

BRBR je izjavil:


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 ?
Tole je cist nerazumljivo napisano. Pojma nimam kaj hoces, kaj dela in kaj ne dela.

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

BRBR ::

he,he, nisem v riti. Tole tvoje čudo dela:
'(?<=^"\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 ()

Spura ::

No, v vecini regexov to ne bi delalo. V Javi naprimer ze ne.

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

BRBR ::

pršparajo velik cajta.
Never underestimate the power of idiots in large groups.

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.

MrBrdo ::

No hvala, zdej mi je še manj jasno :D
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 ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Python separiranje besed v stavkih

Oddelek: Programiranje
91167 (981) Meizu
»

branje iz datoteke c#

Oddelek: Programiranje
141641 (1370) darkolord
»

PHP - stringi

Oddelek: Izdelava spletišč
251784 (1607) pehape
»

java in regex

Oddelek: Programiranje
101157 (1102) alesrosina

Več podobnih tem