Náhrada \K v regexp za assertion

Náhrada \K v regexp za assertion
« kdy: 04. 02. 2023, 16:44:42 »
Mám výraz '^(www)?\K.+?$' (bez uvozovek) volaný  grep-em s parametry -P a především -o (to je důležité, jelikož matchuje jakýkoli řádek, ale výstup je bez toho "pocatek")

Jde nějak ho převést do tvaru aniž by tam bylo \ K  a aniž bych www bylo ve výrazu dvakrát?? Zkoušel jsem
'(?:(www|^)).+?$'
'(?:(www)?).+$'
(?<=www)
(?<=www|^).+$'
a další (i positive lookahead)

nevíc se tomu blíží  sloučení  '^(?!www).+?$'  a (?<=www).+?$'

Ale nikdy se mi nepodařilo přijít na kloub tomu

prostě aby to z řádků
Kód: [Vybrat]
www.neco
wtf.tamto
www.www.hento
vyplivlo (všechny ) řádky, ale s tím oříznutým www, tudíž :
Kód: [Vybrat]
.neco
wtf.tamto
.www.hnto
 

to oříznutí je právě díky -o

Samozřejmě, jde to přes sed a nebo přes ten zmíněný \K v grepu... ale jak to udělám přes grep? Zcela jistě se tam využije něco z non-captring groups, operátor ^, ungreddy modifikátor .+?, lookbehind , lookafter


EDIT: pardon, non capturing groups je nesmysl ... ty by měly smysl v match_data strukurách (třeba výsledek pregmatch vphp) a tady je to plain grep co rovnou háže výstup
« Poslední změna: 05. 02. 2023, 13:23:36 od Petr Krčmář »


Re:náhrada \K v regexp za assertion
« Odpověď #1 kdy: 05. 02. 2023, 09:53:08 »
Ahoj, pomůže tohle? https://regex101.com/r/TejAZp/1

Re:náhrada \K v regexp za assertion
« Odpověď #2 kdy: 05. 02. 2023, 10:26:53 »
 Beze srandy, zkus to předhodit ChatGPT https://openai.com/blog/chatgpt/

Re:náhrada \K v regexp za assertion
« Odpověď #3 kdy: 05. 02. 2023, 10:32:55 »
AI píše: (bez záruky)
Ano, můžete tento výraz převést na: (?:www\.)?(.+?)$

nevim jestli kolem toho nemají být obrácené jednouvozovky, nejdou  mi napsat

« Poslední změna: 05. 02. 2023, 10:36:45 od FKoudelka »

Re:náhrada \K v regexp za assertion
« Odpověď #4 kdy: 05. 02. 2023, 11:20:44 »
Většina  truhlářů zatlouká hřebíky kladivy a vytahuje kleštěmi. Komunita truhlářů řešící problematiku zatloukání hřebíků kleštěmi není příliš početná, je ale vytrvalá.
Man grep, první řádek: print lines matching a pattern.
Man sed: stream editor for filtering and transforming text.


Re:Náhrada \K v regexp za assertion (.(?<!^www\.))+$
« Odpověď #5 kdy: 05. 02. 2023, 19:37:33 »
díky za snahu, ale asi jste to netestovali, neboť to označí celé řádky. To co obarvují ty online nástroje hodně barvičkama ve skutečnosti jsou matching groups asi jste si mysleli, že když to vyznačí jednotlivé skupiny je vyhráno... což by stačilo v případě dalšího zpracování preg_match ... $match[2] (0...celý, jednička případné www., dvojka to co hledám),,, jenže právě to jsem na začátku upozorǚnoval že to má být čistě  vyznačený řetězec shody

TLDR správně je (.(?<!^www\.))+$, ale mám  mírný pocit, že je to z hlediska výkonnosti neefektivní
(a krásné na tom je, že pouhá přítomnost toho znaku stříška ^ ovlivňuje jestli to funguje jen na počáteční www., nebo na poslední www. (což ale není uplně košér, cokoli.www.tamto by mělo pobrat celé, ale www.www.tamto  jsou zapeklité testovací řetězce ,ale lookbehind (?<!(www.)+) je zakázané)

Zkusil jsem  1.
(www\.)?(\S+(\.\S+)?)
i označí od začátku tedy i s www : (

2:
Tak  radu FKoudelky jsem zkusil, nevím-jaký výraz jsem převedl na cat testfile.txt  | grep --color -Pi '^(?:www\.)?(.+?)$' a už od pohledu se mi zdá, že to bode blbost, jelikož  začíná ^, že matchne uplně celý řádek od začátku včetně www a taky že jo, . Zkusil jsem ubrat počáteční ^  a nic. A tuším,



https://regex101.com/r/TejAZp/1

PS: díky i za všimnutí "www." s tečkou, nechtěl jsem to komplikovat

Dopracoval jsem se teď k tomuhle výrazu : ((?<!^www\.).)+$, ale máte tušení proč do shody nezapočte i první znak  za www.?

www.fo.lk
hsa.dk
www.www.doublew

Dá se to řešit i pomocí .(?<!^www\.).)+$, což ale vyřadí uplně z shody www.a, www.b ... je to takové nesystémový hack i když use case pro www.z je nesmysl

Tohle je již správné : (.(?<!^www\.))+$ ( přesun tečky v první závorce na začátek assertion



www.fo.lk
hsa.dk
www.www.doublew
www.o
h
www.kdwk.www.jkjlk.www.kldssaskld
www.www.kdwk.www.jkjlk.www.kldssaskld
www.www.sad.www.sad.www.kdwkjkjlk.www.kldssaskld
www.www.www.sad.www.sad.www.kdwkjkjlk.www.kldssaskld
sad.www.sad.www.kdwkjkjlk.www.kldssaskld
« Poslední změna: 05. 02. 2023, 19:46:44 od mikesznovu »

Re:Náhrada \K v regexp za assertion (.(?<!^www\.))+$e
« Odpověď #6 kdy: 06. 02. 2023, 10:31:43 »
díky za snahu, ale asi jste to netestovali, neboť to označí celé řádky. To co obarvují ty online nástroje hodně barvičkama ve skutečnosti jsou matching groups asi jste si mysleli, že když to vyznačí jednotlivé skupiny je vyhráno... což by stačilo v případě dalšího zpracování preg_match ... $match[2] (0...celý, jednička případné www., dvojka to co hledám),,, jenže právě to jsem na začátku upozorǚnoval že to má být čistě  vyznačený řetězec shody

TLDR správně je (.(?<!^www\.))+$, ale mám  mírný pocit, že je to z hlediska výkonnosti neefektivní
(a krásné na tom je, že pouhá přítomnost toho znaku stříška ^ ovlivňuje jestli to funguje jen na počáteční www., nebo na poslední www. (což ale není uplně košér, cokoli.www.tamto by mělo pobrat celé, ale www.www.tamto  jsou zapeklité testovací řetězce ,ale lookbehind (?<!(www.)+) je zakázané)

Zkusil jsem  1.
(www\.)?(\S+(\.\S+)?)
i označí od začátku tedy i s www : (

2:
Tak  radu FKoudelky jsem zkusil, nevím-jaký výraz jsem převedl na cat testfile.txt  | grep --color -Pi '^(?:www\.)?(.+?)$' a už od pohledu se mi zdá, že to bode blbost, jelikož  začíná ^, že matchne uplně celý řádek od začátku včetně www a taky že jo, . Zkusil jsem ubrat počáteční ^  a nic. A tuším,



https://regex101.com/r/TejAZp/1

PS: díky i za všimnutí "www." s tečkou, nechtěl jsem to komplikovat

Dopracoval jsem se teď k tomuhle výrazu : ((?<!^www\.).)+$, ale máte tušení proč do shody nezapočte i první znak  za www.?

www.fo.lk
hsa.dk
www.www.doublew

Dá se to řešit i pomocí .(?<!^www\.).)+$, což ale vyřadí uplně z shody www.a, www.b ... je to takové nesystémový hack i když use case pro www.z je nesmysl

Tohle je již správné : (.(?<!^www\.))+$ ( přesun tečky v první závorce na začátek assertion



www.fo.lk
hsa.dk
www.www.doublew
www.o
h
www.kdwk.www.jkjlk.www.kldssaskld
www.www.kdwk.www.jkjlk.www.kldssaskld
www.www.sad.www.sad.www.kdwkjkjlk.www.kldssaskld
www.www.www.sad.www.sad.www.kdwkjkjlk.www.kldssaskld
sad.www.sad.www.kdwkjkjlk.www.kldssaskld
Já jsem ti ale neradil ten od pohledu blbý regex, ale ať zkusíš ten ChatGPT. o výsledku se s ním dá diskutovat.