Autor Téma: Regex - Text pred pomlckou  (Přečteno 478 krát)

Offline xnukes

  • Mladík
  • **
  • Příspěvků: 62
  • Karma: 1
    • Verze Delphi: XE7
    • Bludspeed s.r.o.
Regex - Text pred pomlckou
« kdy: 08-11-2017, 15:56:01 »
Hojte, muzu vas poprosit o pomoc ? Ja jsem na regularni vyrazy byl vzdycky lempl :D A potreboval bych z ruznych retezcu napr. (CZ - Praga, A-Weikersdorf,I - Gradara) vypreparovat vzdy ty prvni pismenka dve nebo jedno, zalezi na uzivateli jak to tam zapsal, taky tam vubec byt nemusi.

Co myslite ? pujde to pres regular ? nebo to nekolika x podminkama ostrouhat ?

rustymattock

  • Host
Re:Regex - Text pred pomlckou
« Odpověď #1 kdy: 08-11-2017, 16:15:27 »
jestli je v každém výrazu jen jedna pomlčka tak třeba takhle.

function TForm1.SelectString(text: string):string;
var
  a:integer;
begin
  a:=pos(' -',text);
  result:=Copy(text,1,a-1);
end;

Online Ján Masaryk

  • Nováček
  • *
  • Příspěvků: 48
  • Karma: 5
    • Verze Delphi: 2010
Re:Regex - Text pred pomlckou
« Odpověď #2 kdy: 08-11-2017, 17:03:30 »
... ak by sa ti náhodou stávalo, že raz budeš mať "CZ -" a inokedy "CZ-", tak by som to ešte upravil takto

Kód: Delphi [Vybrat]
  1. cStatSkratka := trim(Copy(text, 1, pos('-', text) - 1));
  2.  

lebo ak dáš " -" a v texte je "-", tak ti to vráti prázdny reťazec.


Offline JM

  • Nováček
  • *
  • Příspěvků: 1
  • Karma: 2
Re:Regex - Text pred pomlckou
« Odpověď #3 kdy: 08-11-2017, 22:19:47 »
Good
Rated 1 time
A co když tam bude třeba Baden-Baden? Pokud tam ten stát vůbec nemusí být,  pak to celé asi není dobře řešitelné.

Online Delfin

  • Hrdina
  • ****
  • Příspěvků: 368
  • Karma: 16
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
    • Ibi Yoyo :)
Re:Regex - Text pred pomlckou
« Odpověď #4 kdy: 08-11-2017, 23:03:35 »
Excellent
Rated 1 time
A co když tam bude třeba Baden-Baden? Pokud tam ten stát vůbec nemusí být,  pak to celé asi není dobře řešitelné.

Z mleteho masa kravu neposkladas ;D Pokud ma uzivatel svobodu zadavat co ho napadne a to navic slepovane do jednoho pole (nebo takovy retezec dostanes na vstupu z jine aplikace), nemuze to skoncit jinak nez nespolehlivymi odhady.
« Poslední změna: 08-11-2017, 23:06:37 od Delfin »
A co chudinky ovce? Koupíš jim snad plovací vesty? Nebo jim nasadíš chůdy? Ještě lepší, kdybys je zkřížil s delfíny na ovce hopkavé!

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1297
  • Karma: 28
    • Pepak.net
Re:Regex - Text pred pomlckou
« Odpověď #5 kdy: 09-11-2017, 06:29:14 »
Search: ^([A-Z]{,2})\s*-
Flags: Case sensitive

Jinak teda států není tolik a nemění se tak často, aby to nešlo vyjmenovat: ^(CZ|DE|I|...)\s*-
« Poslední změna: 09-11-2017, 06:30:48 od pepak »

Online Delfin

  • Hrdina
  • ****
  • Příspěvků: 368
  • Karma: 16
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
    • Ibi Yoyo :)
Re:Regex - Text pred pomlckou
« Odpověď #6 kdy: 09-11-2017, 06:54:27 »
Poor
Rated 1 time
Search: ^([A-Z]{,2})\s*-

Mel jsi nejspis na mysli (v kvantifikatoru je navic carka):

Kód: Delphi [Vybrat]
  1. ^([A-Z]{2})\s*-

Takovy vyraz ale nevybere jen ty 2 pismena. Vybere i tu pomlcku. Odpoved na otazku je (temer) fajn, ale pokud OP nepouziva ve svem projektu knihovnu regularnich vyrazu, netreba ji linkovat (a misto toho pouzit RTL funkce Delphi pro praci s retezci). P.S. https://regexr.com

Ten napad fixniho porovnavani kodu statu je blbost. Par set kilometru ode me se snazi jeden vytvorit. Co pak? Chces do nekonecna udrzovat takovy vyraz (nebo seznam statu pro nej)?
« Poslední změna: 09-11-2017, 07:00:17 od Delfin »
A co chudinky ovce? Koupíš jim snad plovací vesty? Nebo jim nasadíš chůdy? Ještě lepší, kdybys je zkřížil s delfíny na ovce hopkavé!

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1849
  • Karma: 87
    • Verze Delphi: D2007, XE3, DX10
Re:Regex - Text pred pomlckou
« Odpověď #7 kdy: 09-11-2017, 07:00:18 »
Takovy vyraz ale nevybere jen ty 2 pismena. Vybere i tu pomlcku.
Ale ne, prece ten stat ma v zavorce jako group

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1849
  • Karma: 87
    • Verze Delphi: D2007, XE3, DX10
Re:Regex - Text pred pomlckou
« Odpověď #8 kdy: 09-11-2017, 07:05:31 »
Excellent
Rated 2 times
Z mleteho masa kravu neposkladas ;D Pokud ma uzivatel svobodu zadavat co ho napadne a to navic slepovane do jednoho pole (nebo takovy retezec dostanes na vstupu z jine aplikace), nemuze to skoncit jinak nez nespolehlivymi odhady.
Presne, jedna z nejidioctejsich praci, kterou jsem kdy delal, byla normalizace dat z nekdejsiho katalogu firem Edit. Jestli si to pamatuju, tak jenom v Praze tam bylo tusim 200k zaznamu a mam dojem, ze kdybys dostal za ukol vytvorit co nejvice zpusobů, jak zapsat adresu v Praze, ze bys za obsahem toho katalogu skoncil jako B

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1297
  • Karma: 28
    • Pepak.net
Re:Regex - Text pred pomlckou
« Odpověď #9 kdy: 09-11-2017, 07:05:38 »
Good
Rated 3 times
Search: ^([A-Z]{,2})\s*-

Mel jsi nejspis na mysli (v kvantifikatoru je navic carka):

Kód: Delphi [Vybrat]
  1. ^([A-Z]{2})\s*-
Ta čárka tam být musí. Mohla by před ní být jednička, to by asi bylo lepší, ale bez čárky je to blbě.

Citace
Takovy vyraz ale nevybere jen ty 2 pismena. Vybere i tu pomlcku.
Miluju, když do regexpů kecají lidi, kteří jim nerozumí. Ne, nevybere. Od toho tam je první podskupina, abych určil, co přesně se vybere.

Citace
Ten napad fixniho porovnavani kodu statu je blbost. Par set kilometru ode me se snazi jeden vytvorit. Co pak? Chces do nekonecna udrzovat takovy vyraz (nebo seznam statu pro nej)?
Ano. Že se jednou za deset let vytvoří nový stát, to neberu jako limit.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1297
  • Karma: 28
    • Pepak.net
Re:Regex - Text pred pomlckou
« Odpověď #10 kdy: 09-11-2017, 07:07:04 »
Btw., stejně ty státy budeš mít v databázi jako číselník, takže je udržovat budeš. Co je za problém, mít jedno políčko na "zkratka pro vstup X" a z tohoto políčka udělat seznam oddělený rourami?

Online Delfin

  • Hrdina
  • ****
  • Příspěvků: 368
  • Karma: 16
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
    • Ibi Yoyo :)
Re:Regex - Text pred pomlckou
« Odpověď #11 kdy: 09-11-2017, 07:07:52 »
Takovy vyraz ale nevybere jen ty 2 pismena. Vybere i tu pomlcku.
Ale ne, prece ten stat ma v zavorce jako group

Ta pomlcka na konci...
A co chudinky ovce? Koupíš jim snad plovací vesty? Nebo jim nasadíš chůdy? Ještě lepší, kdybys je zkřížil s delfíny na ovce hopkavé!

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1849
  • Karma: 87
    • Verze Delphi: D2007, XE3, DX10
Re:Regex - Text pred pomlckou
« Odpověď #12 kdy: 09-11-2017, 07:14:11 »
Ano. Že se jednou za deset let vytvoří nový stát, to neberu jako limit.
Ja bych se taky klonil k tomu, ze to problem neni a ze se to neobejde do zasahu programu.
Zalezi, co je to aplikace zac a k cemu ten stat potrebuje. Ale on ISO 3166-2 neni jediny kod, ktery pribyde. Dalsi bude kod jazyka, TLD domain, ICC v telefonii, sada svatku, casove pasmo etc...

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1849
  • Karma: 87
    • Verze Delphi: D2007, XE3, DX10
Re:Regex - Text pred pomlckou
« Odpověď #13 kdy: 09-11-2017, 07:18:48 »
Ta pomlcka na konci...
Jenomze na takovyhle fidlatko rovnou zapomen - aniz by to zkousel, tak podle toho, co je na prvni pohled videt, ze je vubec k nicemu.

V run-time je normalni pouzit objekt Match, ktery obsahuje pole skupin, ktere to nalezlo, pri substituci se odkazuje na skupinu jako $1 nebo \1 podle toho, co je to za platformu

Online Delfin

  • Hrdina
  • ****
  • Příspěvků: 368
  • Karma: 16
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
    • Ibi Yoyo :)
Re:Regex - Text pred pomlckou
« Odpověď #14 kdy: 09-11-2017, 07:21:39 »
Poor
Rated 1 time
Miluju, když do regexpů kecají lidi, kteří jim nerozumí. Ne, nevybere. Od toho tam je první podskupina, abych určil, co přesně se vybere.

Dobra, zrejme se bavime o PCRE (implementace je soucasti Delphi pokud se nepletu), potom posli online ukazku. Mas k tomu napr. https://regex101.com. Je to tak slozite nebo se neda online priklad vyrobit?

Jinak si klidne vyrob vyraz z retezce sestaveneho z ciselniku. Me je to jedno. Osobne pro takovy pripad nebudu pouzivat regex.
« Poslední změna: 09-11-2017, 07:25:59 od Delfin »
A co chudinky ovce? Koupíš jim snad plovací vesty? Nebo jim nasadíš chůdy? Ještě lepší, kdybys je zkřížil s delfíny na ovce hopkavé!

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1849
  • Karma: 87
    • Verze Delphi: D2007, XE3, DX10
Re:Regex - Text pred pomlckou
« Odpověď #15 kdy: 09-11-2017, 07:24:55 »
Dobra, zrejme se bavime o PCRE (implementace je soucasti Delphi pokud se nepletu), potom posli online ukazku.
Tak ne, to fildlatko je pouzitelne, i kdyz divne: prepni se na Detail a tam si precti, co to napise v Groups a nebo si precti hint zobrazeny pri hover

Online Delfin

  • Hrdina
  • ****
  • Příspěvků: 368
  • Karma: 16
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
    • Ibi Yoyo :)
Re:Regex - Text pred pomlckou
« Odpověď #16 kdy: 09-11-2017, 07:30:18 »
Poor
Rated 1 time
Tak ne, to fildlatko je pouzitelne, i kdyz divne: prepni se na Detail a tam si precti, co to napise v Groups a nebo si precti hint zobrazeny pri hover

Ja byl puvodne na jinem, https://regexr.com. Ale ta carka v {,2} tam proste nepatri aby z toho byl kvantifikator (snad tedy {1,2}). Rad uvidim online verzi pokud je mozne ji (kompatibilni s Delphi) vytvorit... ::) :-X :)
« Poslední změna: 09-11-2017, 07:41:11 od Delfin »
A co chudinky ovce? Koupíš jim snad plovací vesty? Nebo jim nasadíš chůdy? Ještě lepší, kdybys je zkřížil s delfíny na ovce hopkavé!

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1849
  • Karma: 87
    • Verze Delphi: D2007, XE3, DX10
Re:Regex - Text pred pomlckou
« Odpověď #17 kdy: 09-11-2017, 07:38:15 »
tam proste nepatri aby z toho byl kvantifikator.
Tak uzkoprsy bych nebyl. Ja treba ve vsech editorech a IDE mam regexy trvale zapnuty a jinak nehledam. A pouzivam to na ruznych platformach, kde se ty regexy dost lisim, treba MS neprekvapil a ma svoje specifika, snad aby ho nekdo nenarknul, ze vytvari falsa z Unix sveta nebo proc. Takze clovek obvykle pouziva syntax, se kterou dela deno denne.

Takze korektni namitka je, ze implementace XXX ve verzi YYY u {m,n} je rigidni a vyzaduje pred carkou cislici.
« Poslední změna: 09-11-2017, 07:39:47 od pf1957 »

Online Delfin

  • Hrdina
  • ****
  • Příspěvků: 368
  • Karma: 16
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
    • Ibi Yoyo :)
Re:Regex - Text pred pomlckou
« Odpověď #18 kdy: 09-11-2017, 07:52:36 »
Takze korektni namitka je, ze implementace XXX ve verzi YYY u {m,n} je rigidni a vyzaduje pred carkou cislici.

Uz tomu rozumim. Jsem to ale kus osla ::) Dekuju za vysvetleni! A omlouvam se "expertum" za narceni z extra carky, ktera by soucasti vyrazu byt mela spolu s uvedenim horni hranice kvantifikatoru (alespon tedy pro urcite regex parsery) pro pripady ze pujde o staty jako napr. Rakousko (s kodem statu A?).
« Poslední změna: 09-11-2017, 07:55:05 od Delfin »
A co chudinky ovce? Koupíš jim snad plovací vesty? Nebo jim nasadíš chůdy? Ještě lepší, kdybys je zkřížil s delfíny na ovce hopkavé!

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2974
  • Karma: 29
    • Verze Delphi: XE7 professional
Re:Regex - Text pred pomlckou
« Odpověď #19 kdy: 09-11-2017, 08:09:02 »
Ak máš tvorbu tých výrazov pod kontrolou, tak by som sa zameral na ich tvorbu. Oddeliť názov štátu od ostatného textu. A pomlčku ani netreba zapisovať.
Ja osobne pred každým uložením textu a tiež pri práci s ním použijem najprv funkciu Trim().
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1849
  • Karma: 87
    • Verze Delphi: D2007, XE3, DX10
Re:Regex - Text pred pomlckou
« Odpověď #20 kdy: 09-11-2017, 08:25:11 »
pro pripady ze pujde o staty jako napr. Rakousko (s kodem statu A?).
To do toho mleteho pridavas jeste MPZ, protoze neni kod statu jako kod statu  ;D

Offline xnukes

  • Mladík
  • **
  • Příspěvků: 62
  • Karma: 1
    • Verze Delphi: XE7
    • Bludspeed s.r.o.
Re:Regex - Text pred pomlckou
« Odpověď #21 kdy: 09-11-2017, 14:53:52 »
tady se to rozjelo :D :D hosi resim to tak ze hledam pomlcku pokud nenni preskakuju, pokud je seberu to predtim, trimnu to a pak hledam soubor + '.gif' kdyz nalezne vkladam obrazek, kdyz ne jede se dal :)

Offline leste

  • Nováček
  • *
  • Příspěvků: 5
  • Karma: 0
    • Verze Delphi: D7, XE7
Re:Regex - Text pred pomlckou
« Odpověď #22 kdy: 09-11-2017, 14:57:00 »
To do toho mleteho pridavas jeste MPZ, protoze neni kod statu jako kod statu  ;D
No jo, to tam přidává už tazatel...

Online Delfin

  • Hrdina
  • ****
  • Příspěvků: 368
  • Karma: 16
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
    • Ibi Yoyo :)
Re:Regex - Text pred pomlckou
« Odpověď #23 kdy: 09-11-2017, 17:16:38 »
pro pripady ze pujde o staty jako napr. Rakousko (s kodem statu A?).
To do toho mleteho pridavas jeste MPZ, protoze neni kod statu jako kod statu  ;D

Jo no. Jsem v koncich ;D Mam ten zapis {,2} cist jako kvantifikator pro 0, 1 a 2 znaky?
A co chudinky ovce? Koupíš jim snad plovací vesty? Nebo jim nasadíš chůdy? Ještě lepší, kdybys je zkřížil s delfíny na ovce hopkavé!

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1849
  • Karma: 87
    • Verze Delphi: D2007, XE3, DX10
Re:Regex - Text pred pomlckou
« Odpověď #24 kdy: 09-11-2017, 18:08:28 »
pro pripady ze pujde o staty jako napr. Rakousko (s kodem statu A?).
To do toho mleteho pridavas jeste MPZ, protoze neni kod statu jako kod statu  ;D

Jo no. Jsem v koncich ;D Mam ten zapis {,2} cist jako kvantifikator pro 0, 1 a 2 znaky?
Nejmene 0x, max. 2x. Ale momentalne si nemuzu vzpomenout, ktera implementace to dovolovala takto zapsat, VS to neni

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1849
  • Karma: 87
    • Verze Delphi: D2007, XE3, DX10
Re:Regex - Text pred pomlckou
« Odpověď #25 kdy: 09-11-2017, 18:16:01 »
Excellent
Rated 1 time
pro pripady ze pujde o staty jako napr. Rakousko (s kodem statu A?).
To do toho mleteho pridavas jeste MPZ, protoze neni kod statu jako kod statu  ;D
Nojo... Ja ten dotaz OP ani necetl, reagoval jsem az na tu kritiku Pepakova regexu. A tam se mluvilo o statu a to mi automaticky nabehne ISO kod a ne MPZ

Online Delfin

  • Hrdina
  • ****
  • Příspěvků: 368
  • Karma: 16
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
    • Ibi Yoyo :)
Re:Regex - Text pred pomlckou
« Odpověď #26 kdy: 21-11-2017, 00:53:01 »
pro pripady ze pujde o staty jako napr. Rakousko (s kodem statu A?).
To do toho mleteho pridavas jeste MPZ, protoze neni kod statu jako kod statu  ;D
Nojo... Ja ten dotaz OP ani necetl, reagoval jsem az na tu kritiku Pepakova regexu. A tam se mluvilo o statu a to mi automaticky nabehne ISO kod a ne MPZ

Naopak si vazim nazoru :) Nicmene, co napriklad: "Jinak teda států není tolik a nemění se tak často, aby to nešlo vyjmenovat: ^(CZ|DE|I|...)\s*-"

3m dlouhy seznam statu abych mohl identifikovat ISO kod statu (byt v separatnim modulu)?
« Poslední změna: 21-11-2017, 00:57:22 od Delfin »
A co chudinky ovce? Koupíš jim snad plovací vesty? Nebo jim nasadíš chůdy? Ještě lepší, kdybys je zkřížil s delfíny na ovce hopkavé!

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1849
  • Karma: 87
    • Verze Delphi: D2007, XE3, DX10
Re:Regex - Text pred pomlckou
« Odpověď #27 kdy: 21-11-2017, 08:58:35 »
Excellent
Rated 1 time
3m dlouhy seznam statu abych mohl identifikovat ISO kod statu (byt v separatnim modulu)?
To asi zalezi na konkretni aplikaci k cemu to potrebuje, protoze je rozdil, jestli se strika nejaka quick&dirty sr*cka a nebo se seriozne programuje...

Osobne bych v parseru oddelil syntaxi od semantiky tj. regexem vytahl kod statu do groupy a hodnotu nasledne mimo regex predhodil nejakemu multi-kulti polymorfnimu validatoru, ktery by mi vratil, zda je kod statu pro aplikaci akceptovatelny, protoze ne kazdy kod existujiciho statu musi byt pro aplikaci akceptovatelny a ne kazda instalace/customizace aplikace musi pracovat se stejnou mnozinou statu.

Takovy samotny validator je reusable a da se pouzit pro kazdou kontrolu kodu statu, bez ohledu na to, odkud ten kod statu pochazi a da se to udelat ve forme metody Find/Fetch, ktera vrati v instanci objektu vsechny informace, ktere aplikace v souvislosti s danym statem potrebuje cili neco jako CountryContext.

Jestli to budu jako ciselnik v persistentni repository nebo jako nejaky natvrdo zadany seznam v kodu nebo si nekam poslu dotaz treba pomoci web service apod. je az druhotne.
« Poslední změna: 21-11-2017, 09:02:16 od pf1957 »

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Jméno: E-mail:
Ověření:
Datový typ v Delphi, který má True a False: