Regulární výrazy a oddělení řetězce

Regulární výrazy a oddělení řetězce
« kdy: 13. 09. 2011, 11:02:32 »
Zdravim vsetkych,

potreboval by som oddelit cast retazca. Predpokladam, ze kazdy z vas by to robil pomocou regularnych vyrazov. Jedna sa o nazov produktu pre eshop. Nazvy maju takyto tvar:

cerstva-sojova-klobasa-500-g
salamove-kapsule-12-x-50-ml

Potrebujem z nazvu oddelit udaje o hmotnosti a pocte. Cize z tychto dvoch produktov potrebujem dostat:

cerstva-sojova-klobasa
salamove-kapsule

Napisal som preto regularny vyraz, ktory by mal detekovat pozadovanu cast retazca, zial tak nerobi a sprava sa inak ako by som ocakaval(je to sposobene pravdepodobne tym, ze co sa s nim deje na pozadi). Prvy vyraz funguje na prvy nazov ale nie na druhy, druhy vyraz funguje na druhy nazov ale nie na prvy. Chcel by som dosiahnut, aby jeden vyraz fungoval na obidva nazvy. Tu su tie vyrazy:

/(.*)-(\d+-\w-)?(\d+)-?(\w{1,3})$/
/(.*)-(\d+-\w-)(\d+)-?(\w{1,3})$/

Rozdiel medzi vyrazmi je iba v otazniku.
Ak sa niekto stretol s niecim podobnym, prosim poradte...

Dakujem
« Poslední změna: 13. 09. 2011, 11:44:09 od Petr Krčmář »


pecko

  • ***
  • 105
    • Zobrazit profil
    • E-mail
Re: Regulární výrazy a oddělení řetězce
« Odpověď #1 kdy: 13. 09. 2011, 12:15:19 »
skus /^([a-z\-]+)\-(.*)$/i

Re: Regulární výrazy a oddělení řetězce
« Odpověď #2 kdy: 13. 09. 2011, 12:15:32 »
Kód: [Vybrat]
~-?([^\d]+)-~
:)

Re: Regulární výrazy a oddělení řetězce
« Odpověď #3 kdy: 13. 09. 2011, 12:28:21 »
To bys musel líp specifikovat, jakej má ten řetězec tvar. Pokud název neobsahuje číslice a další část číslicí začíná, tak na to jdeš zbytečně složitě a stačí použít, co ti tady navrhli kolegové.

Pokud je to nějaký zapeklitější, tak musíš ten formát přesně popsat...

Kód: [Vybrat]
# echo cerstva-sojova-klobasa-500-g | perl -p -e 's/([^\d]+)-(\d.*)/\1 ...a... \2/'
cerstva-sojova-klobasa ...a... 500-g
# echo salamove-kapsule-12-x-50-ml | perl -p -e 's/([^\d]+)-(\d.*)/\1 ...a... \2/'
salamove-kapsule ...a... 12-x-50-ml

D3ryk

Re: Regulární výrazy a oddělení řetězce
« Odpověď #4 kdy: 13. 09. 2011, 12:34:38 »
Otazka je co na to chces pouzit? Jaky programovaci jazyk? Pokud pouzivas treba PHP tak zkus funkci "explode" http://us3.php.net/manual/en/function.explode.php pokud jsou data predavana porad v uvedenem formatu tak je to podle me velice efektivni zpusob.


Re: Regulární výrazy a oddělení řetězce
« Odpověď #5 kdy: 13. 09. 2011, 12:43:28 »
Jedna sa o identifikaciu a odrezanie tych koncovych retazcov, cize:

"500-g" alebo "12-x-50-ml"

Ide o to ze namiesto "500-g" moze byt "20-ml" alebo "50-kps", cize pocet a skratka jednotky.
Pokial sa jedna napr o balenie kapsul cize "12-x-50-ml", moze to byt aj "100-x-100-g".

Z toho vyrazu, ktory som napisal, je myslim zrejme ako ich detekovat. Pred tymito koncovkami sa vlastne mozu nachadzat tieto znaky [a-b0-9-].

D3ryk: Je to v PHP. Dalo by sa pouzit aj explode, ale myslim, ze regularne vyrazy su elegantnejsi sposob - len zatial nefunguje  ;)

Re: Regulární výrazy a oddělení řetězce
« Odpověď #6 kdy: 13. 09. 2011, 13:10:19 »
Z toho vyrazu, ktory som napisal, je myslim zrejme ako ich detekovat. Pred tymito koncovkami sa vlastne mozu nachadzat tieto znaky [a-b0-9-].

Neni to zrejme. Co kdyz se bude vyrobek jmenovat "blbost-50-x" a mnostvi bude "50-ml"?
Pak dostanu "blbost-50-x-50ml" a nemam to jak odlisit od vyrobku "blbost" v 50 kusech po 50ml.

Proste pokud tam nemas nejakou dalsi omezujici podminku pro nazev, tak to bezpecne nejde.

Re: Regulární výrazy a oddělení řetězce
« Odpověď #7 kdy: 14. 09. 2011, 08:57:45 »
Citace
Co kdyz se bude vyrobek jmenovat "blbost-50-x" a mnostvi bude "50-ml"?

Teoreticky by k tomu mohlo dojst, ale nazvy produktov sa konzultovali so zakaznikom, takze by k tomu dojst nemalo.

Potrebujem skratka spravit len detekciu toho tvaru(2-x-50-ml alebo iba 50-ml) na konci retazca...

Re: Regulární výrazy a oddělení řetězce
« Odpověď #8 kdy: 14. 09. 2011, 09:43:02 »
Teoreticky by k tomu mohlo dojst, ale nazvy produktov sa konzultovali so zakaznikom, takze by k tomu dojst nemalo.

"Teoreticky by k tomu nemelo dojit" vzdycky znamena, ze driv nebo pozdeji bude nekdo prekvapenej :)

Nicméně teda jestli se nepletu, tak je problém v tom, že když máš pattern
Kód: [Vybrat]
/(.*)-(\d+-\w-)?(\d+)-?(\w{1,3})$/
tak to (\d+-\w-)? ti NIKDY nic nenamatchuje, protože REs jsou hladové - tj. to .* před ním vždycky sežere maximum, co může a na (\d+-\w-)? nic nezbude. Musel bys tam mít právě nějakou tu omezující podmínku, jako třeba že slova v názvu výrobku nebudou začínat číslicí.

Příklad:
Kód: [Vybrat]
# echo 123456 | perl -p -e 's/(.*)(4?)(.*)$/\1 .. \2 .. \3/'
123456 ..  ..        <- tady se mi ta 4ka proste nenamatchuje!
# echo 123456 | perl -p -e 's/([^4]*)(4?)(.*)$/\1 .. \2 .. \3/'
123 .. 4 .. 56

Mirek

Re: Regulární výrazy a oddělení řetězce
« Odpověď #9 kdy: 15. 09. 2011, 11:06:29 »
To na mě dělá dojem, že "vykrádá" nějaký existující e-shop(y) a snaží se založit vlastní a nemá téměř žádné znalosti.
Přece profesionál, který pro zákazníky dělá e-shopy si musí s takouvouto trivialitou snadno poradit.

Mmad

Re: Regulární výrazy a oddělení řetězce
« Odpověď #10 kdy: 16. 09. 2011, 08:09:17 »
Lepší návrh: před ty jednotky mrskni dvě pomlčky místo jedné a podle nich to rozděluj. Riziko vyrobení chyby se sníží. Dále je potřeba u toho explode() zajistit, abys dál pracoval pouze s posledním článkem, čímž zamezíš chybě, když budou dvě pomlčky i dříve.