
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.
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.
on je trochu problém i s tím, že syntaxe regexpu se liší podle implementace.
repeat.html
Problém je ten, že pokud bys chtěl použít otazník (tedy výskyt ano/ne) na jedno (libovolné) písmenko dvoupísmenného stringu, musel bys to napsat jako ^.?b$
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)