Funkce string:find( ) v Lua a tečka

D.A. Tiger

  • ****
  • 486
  • Tygr, který žere tučňáka ;-)
    • Zobrazit profil
    • E-mail
Funkce string:find( ) v Lua a tečka
« kdy: 19. 03. 2010, 12:58:45 »
Zdravím

Mám takový problém s funkcí jazyka Lua string:find( ) vyhledávající znaky v řetězci. Potřebuji podobnou funkci jakou má například Perl která dokáže podle zadaného separačního znaku převést řetězec na subřetězce. Protože Lua žádnou takovou funkci nemá, tak jsem si ji napsal (testovací verzi uvádím na konci dotazu). Ve zkratce funguje tak, že pomocí Lua funkce string:find( ) se určí pozice separačního znaku v řetězci a z těchto hodnot se potom určí počátek a konec požadovaného subřetěce. Tyto hodnoty jsou poté předány funkci string:sub( ), která požadovaný výsek řetězce separuje. Tento proces probíhá tak dlouho dokud funkce nedojde na konec zpracovávaného řetězce. Návratovou hodnotou funkce je počet nalezených subřetězců.   

Vše funguje tak jak má, až do té chvíle, kdy se pokusím zpracovat řetězec jehož části jsou odděleny znakem ".".  string:find( ) vrací potom (z mě neznámého důvodu) nesmyslné hodnoty a celý proces jde do háje. Nepomůže ani před separační znak vložit znak zpětného lomítka. Nevíte, prosím, někdo proč? A popřípadě co s tím dělat. Díky moc,

Popisovaná fukce :
function split( in_str, sub_str, out_dim )
  local a = 0                         -- pozice pred hledanym znakem
  local b = 0                         -- pozice za hledanym znakem
  local c = 0                         -- cislo cyklu
  local s = 0                         -- zacatek hledaneho subretezce
  local length = string.len( in_str ) -- Celkova velikost prohledavaneho retezce
 
  print( "Source string    : " .. in_str )
  print( "Length           : " .. length )
  print( "separator string : " .. sub_str )
 
  while b ~= -1 do
    a, b = string.find( in_str, sub_str, b )
    if b ~= nil then
      b = b + 1
      a = a - 1
    else
      a = length
      b = -1
    end
   
    print( "___________________" ) 
    print( "Cycle : " .. c )
    print( "a = " .. a )
    print( "b = " .. b )
    print( "s = " .. s )
    print( string.sub( in_str, s, a ) )
                 
    s = b
    c = c + 1
  end
 
  return c
end 

Výstup funkce split  - testovací řetězec se znaky ":"
> test_str1 = "ABCD:EFGH:CHIJK"
> x1 = split( test_str1, ":", nil )
Source string    : ABCD:EFGH:CHIJK
Length           : 15
separator string : :
___________________
Cycle : 0
a = 4
b = 6
s = 0
ABCD
___________________
Cycle : 1
a = 9
b = 11
s = 6
EFGH
___________________
Cycle : 2
a = 15
b = -1
s = 11
CHIJK
> print( x1 )
3


se znaky "." (vypis jsem trochu zkrátil )
>test_str2 = "ABCD.EFGH.CHIJK"
>x2 = split( test_str2, ".", nil ) 
Source string    : ABCD.EFGH.CHIJK
Length           : 15
separator string : .
___________________
Cycle : 0
a = 0
b = 2
s = 0

___________________
Cycle : 1
a = 1
b = 3
s = 2

___________________
Cycle : 2
a = 2
b = 4
s = 3

___________________
Cycle : 3
a = 3
b = 5
s = 4

___________________
...
___________________
Cycle : 14
a = 14
b = 16
s = 15

___________________
Cycle : 15
a = 15
b = -1
s = 16

> print( x2 )
16
« Poslední změna: 20. 03. 2010, 09:06:05 od Petr Krčmář »


wamba

Re: Funkce string:find( ) v Lua a znak "."
« Odpověď #1 kdy: 19. 03. 2010, 15:29:04 »
po rychlém nahlédnutí do lua manuálu, asi stačí dát
Kód: [Vybrat]
%.navíc si myslím, že namísto  "perlovského"
Kód: [Vybrat]
split se používá
Kód: [Vybrat]
string.gmatch tedy něco jako
Kód: [Vybrat]
for w in string.gmatch(s, "[^.]+") do
       print(w)
     end

D.A. Tiger

  • ****
  • 486
  • Tygr, který žere tučňáka ;-)
    • Zobrazit profil
    • E-mail
Re: Funkce string:find( ) v Lua a znak "."
« Odpověď #2 kdy: 19. 03. 2010, 15:55:53 »
string.gmatch( ) nějak unikl pozornosti - je o dost lepší než ten můj původní. Díky za "nakopnutí" už to krásně pracuje...  :)