Sziasztok,
Elég kezdő vagyok regex téren, ugyhogy a következő kérdés lehet ,hogy triviális sok embernek :)
Adott egy sztring : A1234@2@2
Az "A" betű és az első @ karakter közötti karaktersorozat kellene nekem regex segitségével.
A @ karakterek száma a sztringben változó, ahogy a kivánt karaktersorozat hossza is.
Tehát A1@2
és A123543254@23@2356@234@23
is lehetséges mint bejövő sztring.
A következő regex kifejezést próbáltam:
(?'elso'A)(?'masodik'.*)(?'harmadik'@.*)
Nekem a "masodik" csoportben levő eredmény kell nyilvánvalóan.
A fenti kifejezésre ezt kapom:
elso: A
masodik: 1233@2
harmadik: @2
FIXME, de a regex kiértékelés balról jobbra halad. Én azt vártam, hogy az első @ és minden további karakter a harmadik csoportba kerül.
Tuti elnézek valamit, de nem tudok rájönni.
Próbáltam lookahead segitségével is igy:
(?'elso'A)(?'masodik'.*(?=(@.*)))(?'harmadik'@.*)
De ugyanazt az eredményt kapom...
please help...
Hozzászólások
A regexp mindig a lehetséges leghosszabb változatra illeszkedik, ezért a legutolsó @ karakterig ment.
Érdekes
Ezzel is probléma volt, vagy fel sem vetődött?
perl -e '$x = "A1234\@2\@2"; $x =~ /^A([^@]+)@/; print "$1\n"'
B... most látom, hogy .net... bocs, tudjuk be a cserszeginek!
Az egy dolog, hogy nagyon kezdo vagy regexp-ben, de 1 nappal korabban volt teljesen ugyanez a kerdes (bar ott '@' helyett ':'-tal).
http://hup.hu/node/106219
Most komolyan nem lehet sem a keresoben sem az archivumban megtalalni egy 1 napos bejegyzest?
(egyebkent ott tobben leiruk a megoldast meg az okot, szoval meg hasznos lehet szamodra)
--
Always remember you’re unique, just like everyone else.
.* helyett esetleg ezt probald meg: [^@]*
kategória senkinek nem szúr szemet? :)
.NET??? :)
(rejtett subscribe)
Ez nem jó neked?
Esetleg ez?
Vagy még:
@@A1234@2@2
Nem tudom, hogy elofordulhat-e ilyen, de a szamozasodat igencsak megzavarja.
--
Always remember you’re unique, just like everyone else.
Igazad van. Nem panaszkodott az eredeti kérdező és te nem írtál megoldást, akkor kíváncsi vagy menne e jobban? :)
Így akár van elől kukac, akár nincs, az 1234 a tomb[2]-ben lesz.
De fogadok tudsz még kifogást. ;)
Linkeltem az elozo topicot, amiben tobb megoldas is szerepelt (tobbek kozt tolem), de itt is irtak mar, hogy a [^@]* az, amit keres.
Ha szokasos regexp, gondolom .net-ben is van ra tamogatas, hogy ne csak split-elni lehessen, hanem match-elni is. Mert ide az a jobb.
Nem ismerem a .net-es szintaxist. Erre is jo, amit irtal?
String str = "B@BB@BA1234@2@2";
--
Always remember you’re unique, just like everyone else.
Üdv!
Nem jó. De legyen itt egy újabb, amely mind a három esetben jó:
Hozzá kell tennem, hogy ezeket Mono keretrendszerrel teszteltem.
De így kell működjön .Net keretrendszerrel is!
Igaz Powershell de a .NET alapokra epitkezes miatt szerintem ez jo lesz neked:
-----
Üdv, icee
Fogalmazzuk át a kérdést: Az első "A" betűtől kell mindaz,a mi nem @, és egy darab @.
/\A([^@]+@)/
Ahol nincs \A, ott:
/^([^@]+@)/
(a perjelek regex hatarolok, csereld le oket izles szerint.)
--
Sziasztok,
Bajban vagyok egy regexel:
find . | grep -o '.\{,3\}$' | sort | uniq
Nem veszi észre a docx, xlsx eket.
Pedig odatettem a kis vesszőt, hogy legalább 3x os illeszkedést szeretnék
-- Zoli
Szerintem rossz helyen van a vessző: a hármas mögé kellene. Tévedés joga fenntartva! ;)
Próbáltam azt is, de nem működik.
Most ideiglenesen megoldottam így:
find . | awk -F '.' '{print $3}' | sort | uniq
-- Zoli
grep -oE '\..{3,}$'
Most kipróbáltam. (kissé kijöttem a gyakorlatból)
Illetve másik verzió:
grep -o '\..\{3,\}$'
Igen, be kell kapcsolni a \ jellel a {} jeleket.
Viszont, még mindig nem jó ez:
find . | grep -o '\..\{3,\}$'
Az kellene, hogy csak a pont kiterjesztéseket adja vissza. Egyébként nem értem, hogy miért nem megy, mert szerintem ez a szabályos kifejezés azt jelenti, hogy:
-sorvégére igazítani $
-legalább három bármilyen karakter, ami előtt .\{3,\}
-1db pont karakter szerepel \.
nem tudom, hogy miért nem listázza csak a kiterjesztéseket...
-- Zoli
> nem tudom, hogy miért nem listázza csak a kiterjesztéseket...
man grep:
-o, --only-matching
Print only the matched (non-empty) parts of a matching line,
with each such part on a separate output line.
--
Debian - The "What?!" starts not!
http://nyizsa.blogspot.com
tudom, hogy az -o mit jelent, de akkor sem működik
-- Zoli
Működik az... De ha csak a kiterjesztés (utolsó pont és az az utáni legalább három karakter) kell, akkor azt kell mondanod, hogy:
és a mintát célszerűen szimpla idézőjelek között, hogy a shell ne foglalkozzon vele:
Ja, késő volt, beleláttam még egy vesszőt oda, ahol nem is volt.
Amúgy miért határozod meg önkényesen a min. 3 karaktert?
--
Debian - The "What?!" starts not!
http://nyizsa.blogspot.com
?
Mivel a regexp a mindig a legbovebb lehetseges egyezest keresi, ezert szerintem a .\{3,\} resz 3 vagy a leheto legtobb karakterre illeszkedik. Jelen esetben a teljes sorra, kiveve a sor elejen levo '.' karaktert, ami mindehol ott van a lista eredmenyeben. Tehat valojaban a teljes sorra illeszkedik a mintad.
Bat ez meg mindig nem csak a kiterjeszteseket adja vissza, de ahol van kiterjesztes, ott csak azt en valami hasonloval indulnek es probalkoznek tovabb:
find . | grep -o '\.[^.]\{3,\}$'
De az -o kapcsolónak ki kellene emelnie csak magát a 'találatot'
find . | grep -o '\.[^.]\{3,\}$' | sort -g| uniq
nem ugyanazt adja, mint a :
find -name '*.*' | awk -F '.' '{print $3}' | sort -g | uniq
Lehetséges, hogy erre a konkrét feladatra az awk jobban alkalmas?
Ez a sor nekem azért kell, hogy létrehozzak olyan nevű könyvtárakat, mint amilyen kiterjesztésű fájlok vannak.
-- Zoli
Ezzel (szerintem) az a gond, hogy fixen a 3. szót íratod ki. Helyette inkább $NF tűnik jónak.
Nekem ez:
find / -type f -name '*.*' | grep -Eo '\.[^\.]{3,}$' | sort | uniq
és ez:
find / -type f -name '*.*' | awk -F '.' '//{ print $NF }' | sort | uniq
nagyjából azonos eredményt produkált, annyi eltéréssel, hogy a grep -o a pontot is visszaadta, míg az awk értelemszerűen lecsapta.
Sziasztok,
Azt szeretném, hogy ne listázza ki a:
.sh
.sh~
végződésű fájlokat,
Itt tartok, de az -or utáni részt nem hajtja végre, ugyanúgy listázza a .sh~ végződésűeket is:
find . -type f \( ! -iname "*.sh" -or -iname "*.sh~" \)
Van ötletetek?
-- Zoli
find . -type f -not \( -iname "*.sh" -or -iname "*.sh~" \)
Köszi, szuper!
-- Zoli