Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Debian - terminal - Regulární výrazy

Zdravim!

Měl bych jen takový menší dotaz, týkající se regulárních výrazů. Trochu si hraju v terminálu v Debianu.

grep -E "^a?b$"

Pokud napíšu tento příkaz - Vrátí mi to puze 'ab' nebo 'b'. Čili 'a' tam být může, ale nemusí. 'b' tam musí být vždy. No a samozřejmě musí být max. 2-znakové.

grep -E "^?b$"

Co když napíši tento příkaz? Očekával bych, že to bude vracet pouze 'b' - ale po vyzkoušení mi to vrací libovolně dlouhé řetězce - končící na 'b' samozřejmě.

Jde mi pouze o to, jak to v tom druhém případě funguje. Něco mi zjevně uniká. :)

Díky.

Předmět Autor Datum
Otazníkem jsi nastavil laziness na začátek řádku, což je IMHO blbost. Teoreticky, pokud to projde ja…
touchwood 16.04.2015 22:18
touchwood
Tak jak říkáte, tak to hledá no - 'b' a string končící na 'b'. To bych chápal, kdyby to nebylo ukot…
Vánoce 17.04.2015 08:42
Vánoce
on je trochu problém i s tím, že syntaxe regexpu se liší podle implementace. repeat.html Problém j…
touchwood 17.04.2015 09:33
touchwood
Nejpíš je to blbost,no, používat '?' pouze na jedno písmeno ... Proto mě i udivuje, že mi ten termin…
Vánoce 17.04.2015 20:14
Vánoce
grep -E "^a?b$" hleda radky, takove, ze obsahuji: ^ = zacatek radku a? = (potom) bud jedno a, nebo… poslední
gilhad 25.04.2015 02:50
gilhad

Otazníkem jsi nastavil laziness na začátek řádku, což je IMHO blbost. Teoreticky, pokud to projde jako validní, hledáš dva stringy ^b$ a (podle mě) ekvivalent pro .+b$

Ale můžu se mýlit, regex si musím vždycky připomínat, v hlavě to mimo triviálních věcí nenosím.

Tak jak říkáte, tak to hledá no - 'b' a string končící na 'b'.

To bych chápal, kdyby to nebylo ukotvený těmi '^ $' - které mi, pokud vím, určují délku řetězce (v tomto případě by měli být snad maximalně 2).Nejspíš je to opravdu blbost,spíš mi šlo jenom o to, to nějak pochopit - proč se to chová, tak jak se to chová.

Předtím jsem myslel že u každého tohoto znaku je nutné zadat před i za nějaký jiný znak ( 'a?b' nebo 'a+bcd' )

Pak jsem narazil na tyto stranky, kde používali znaky pouze za tím řetězcem a dál už nic ... proto mě napadlo zkusit to i s tím '?'.
http://www.regularnivyrazy.info/shrnuti-syntaxe.ht ml#.VTCn9JMXu-0

Nejspíš to tak platí pouze pro '+' a '*' a '?' by měl mít znaky před i za.

Nejpíš je to blbost,no, používat '?' pouze na jedno písmeno ...
Proto mě i udivuje, že mi ten terminál nic nenamítá.

(právě jsem zjistil, že jsem to celé chápal trochu blbě :D

protože např. "^a+b$" - já jsem myslel, že to '+' se vztahuje na oba dva znaky 'a' i 'b' a nějak je to ovlivňuje a ono se to plus vlastně vztahuje pouze na to 'a' - no, popisovat tu své myšlenkové pochody nebudu :D )

V tom případě ten otazník na nic nevolam?

Každopádně, děkuju za odpovědi. :) Alepsoň jsem si tu uvědomil, jak to funguje.
(Zdá se me, že si někdy věci až moc komplikuju :-| )

grep -E "^a?b$"

hleda radky, takove, ze obsahuji:
^ = zacatek radku
a? = (potom) bud jedno a, nebo nic
b = (potom) b
$ = (potom) konec radku

cili radky, ktere od zacatku obsahuji pouze a (nebo nic) a potom b a pak konci (takze radky "ab" a "b")

grep -E "^?b$"
helad radky takove, ze obsahuji:

^? = zacatek radku (nebo nic)
b = (potom) b
$ = (potom) konec radku

cili bud radky, ktere obsahuji pouze jedno b (kdyz tam je ten zacatek), nebo obsahuji b na konci (kdyz tesne pred nim ten zacatek neni). Tady ten otaznik aplikujes na ^, coz je zacatek radku. Takze zacatek radku tesne pred b byt muze a nemusi (podminka dost na houby)

Zpět do poradny Odpovědět na původní otázku Nahoru