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...
- 10505 megtekintés
Hozzászólások
(?'elso'A)(?'masodik'[^@]*)(?'harmadik'@.*)
A regexp mindig a lehetséges leghosszabb változatra illeszkedik, ezért a legutolsó @ karakterig ment.
- A hozzászóláshoz be kell jelentkezni
Érdekes
- A hozzászóláshoz be kell jelentkezni
Ezzel is probléma volt, vagy fel sem vetődött?
perl -e '$x = "A1234\@2\@2"; $x =~ /^A([^@]+)@/; print "$1\n"'
- A hozzászóláshoz be kell jelentkezni
B... most látom, hogy .net... bocs, tudjuk be a cserszeginek!
- A hozzászóláshoz be kell jelentkezni
Az egy dolog, hogy nagyon kezdo vagy regexp-ben, de 1 nappal korabban volt teljesen ugyanez a kerdes (bar ott '@' helyett ':'-tal).
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.
- A hozzászóláshoz be kell jelentkezni
A következő regex kifejezést próbáltam:
(?'elso'A)(?'masodik'.*)(?'harmadik'@.*)
.* helyett esetleg ezt probald meg: [^@]*
- A hozzászóláshoz be kell jelentkezni
kategória senkinek nem szúr szemet? :)
.NET??? :)
(rejtett subscribe)
- A hozzászóláshoz be kell jelentkezni
Ez nem jó neked?
String[] tomb = Regex.Split(str, "(A)|(@)");
Esetleg ez?
String[] tomb = Regex.Split(str, "(A|@)");
Vagy még:
String[] tomb = Regex.Split(str, "A|@");
- A hozzászóláshoz be kell jelentkezni
@@A1234@2@2
Nem tudom, hogy elofordulhat-e ilyen, de a szamozasodat igencsak megzavarja.
--
Always remember you’re unique, just like everyone else.
- A hozzászóláshoz be kell jelentkezni
Igazad van. Nem panaszkodott az eredeti kérdező és te nem írtál megoldást, akkor kíváncsi vagy menne e jobban? :)
String str = "@@A1234@2@2";
String[] tomb = Regex.Split(str, "(@*A)|A|@");
Így akár van elől kukac, akár nincs, az 1234 a tomb[2]-ben lesz.
De fogadok tudsz még kifogást. ;)
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Üdv!
Nem jó. De legyen itt egy újabb, amely mind a három esetben jó:
String str = "@@A1234@2@2";
//String str = "A1234@2";
//String str = "B@BB@BA1234@2@2";
String[] tomb = Regex.Split(str, ".*A|A|@");
Hozzá kell tennem, hogy ezeket Mono keretrendszerrel teszteltem.
De így kell működjön .Net keretrendszerrel is!
- A hozzászóláshoz be kell jelentkezni
Igaz Powershell de a .NET alapokra epitkezes miatt szerintem ez jo lesz neked:
"A123543254@23@2356@234@23" -match "A(.*?)@(.*?)@";"Matches:";$matches;"`n2nd match:";$matches[2]
True
Matches:
Name Value
---- -----
2 23
1 123543254
0 A123543254@23@2nd match:
23
-----
Üdv, icee
- A hozzászóláshoz be kell jelentkezni
Fogalmazzuk át a kérdést: Az első "A" betűtől kell mindaz,a mi nem @, és egy darab @.
- A hozzászóláshoz be kell jelentkezni
/\A([^@]+@)/
Ahol nincs \A, ott:
/^([^@]+@)/
(a perjelek regex hatarolok, csereld le oket izles szerint.)
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Szerintem rossz helyen van a vessző: a hármas mögé kellene. Tévedés joga fenntartva! ;)
- A hozzászóláshoz be kell jelentkezni
Próbáltam azt is, de nem működik.
Most ideiglenesen megoldottam így:
find . | awk -F '.' '{print $3}' | sort | uniq
-- Zoli
- A hozzászóláshoz be kell jelentkezni
grep -oE '\..{3,}$'
Most kipróbáltam. (kissé kijöttem a gyakorlatból)
Illetve másik verzió:
grep -o '\..\{3,\}$'
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
> 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
- A hozzászóláshoz be kell jelentkezni
tudom, hogy az -o mit jelent, de akkor sem működik
-- Zoli
- A hozzászóláshoz be kell jelentkezni
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:
csak az egyező részt -o extended regexp -E pont \. nem pont [^.] három vagy többször {3,} sor vége $
és a mintát célszerűen szimpla idézőjelek között, hogy a shell ne foglalkozzon vele:
ls | egrep -oE '\.[^.]{3,}$' | sort -u
.awk
.bz2
.cpio
.csv
.lst
.orig
.pdf
.pub
.reg
.result
.stackdump
user@host ~
$
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Az kellene, hogy csak a pont kiterjesztéseket adja vissza.
?
- A hozzászóláshoz be kell jelentkezni
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,\}$'
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
find . -type f -not \( -iname "*.sh" -or -iname "*.sh~" \)
- A hozzászóláshoz be kell jelentkezni
Köszi, szuper!
-- Zoli
- A hozzászóláshoz be kell jelentkezni