Regex kérdés (nagyon kezdő)

Fórumok

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


(?'elso'A)(?'masodik'[^@]*)(?'harmadik'@.*)

A regexp mindig a lehetséges leghosszabb változatra illeszkedik, ezért a legutolsó @ karakterig ment.

Ezzel is probléma volt, vagy fel sem vetődött?


perl -e '$x = "A1234\@2\@2"; $x =~ /^A([^@]+)@/; print "$1\n"'

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.

A következő regex kifejezést próbáltam:
(?'elso'A)(?'masodik'.*)(?'harmadik'@.*)

.* helyett esetleg ezt probald meg: [^@]*

kategória senkinek nem szúr szemet? :)
.NET??? :)

(rejtett subscribe)

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|@");

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. ;)

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ó:


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!

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

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.)
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal 

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

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

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 ~
$ 

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