Začínáme s ASP, 9. díl: Operace s řetězci II/II

Dnes dokončíme téma řetězců.
Hledání, porovnávání a záměna řetězců

InStr    ( [ začátek,] řetězec1, řetězec2 [, typ porovnávání] )
InStrRev ( řetězec1, řetězec2 [,začátek [, typ porovnávání]]  )

InStr – vrátí pozici prvního výskytu řetězce 2 v řetězci 1 – hledání je prováděno zleva

InStrRev – vrátí pozici prvního výskytu řetězce 2 v řetězci 1 – hledání je prováděno zprava

začátek - volitelný parametr (číslo), který nastavuje počáteční pozici pro hledání. Pokud je vynechán, probíhá hledání od prvního znaku (resp. posledního znaku u funkce InStrRev) – je dosazena hodnota -1. Parametr je nutné zadat, pokud je definován typ porovnávání.

Funkce může vrátit následující hodnoty:

0 ......... řetězec1 je nulový, nebo řetězec2 nebyl nalezen
začátek ... řetězec2 je nulový
Null ...... řetězec1 nebo řetězec2 jsou Null
>0 ........ řetězec2 byl v řetězci1 nalezen na této pozici

InStr    ("axabcxAxcab", "a")            ‘=1
InStr    (4, "axabcxAxcab", "A", 1)      ‘=7
InStrRev ("axabcxAxcab", "b")            ‘=11
InStrRev ("axabcxAxcab", "A", -1, 0)    ‘=7

StrComp( řetězec1, řetězec2 [, typ porovnávání] )

Vrátí hodnotu indikující vzájemný vztah dvou řetězců.

(řetězec1 a řetězec2). Třetí parametr definuje způsob porovnávání, tedy binární nebo textové.

Funkce může vrátit 4 hodnoty:

-1 ...... řetězec1 < řetězec2
0 ...... řetězec = řetězec2
1 ...... řetězec1 > řetězec2
Null.... řetězec1 nebo řetězec2 jsou Null

Malý příklad vše ozřejmí:

Dim Str1, Str2, Res
Str1 = "ASP"
Str2 = "asp"     
Res = StrComp(Str1, Str2, 1)    ‘ .....  Res =  0 
Res = StrComp(Str1, Str2, 0)    ‘ .....  Res = -1     
Res = StrComp(Str2, Str1)      ‘ .....  Res =  1     

Replace( výraz, hledaný_řetězec, nahradit_čím, [začátek [, počet [,typ porovnávání]]] )

Funkce vrátí řetězec, ve kterém je zaměněn specifikovaný podřetězec jiným podřetězcem. Záměna řetězců se může blíže omezit také na pouhou část řetězce a počet záměn. Podobně jako u funkce StrComp také tato funkce pracuje s dvěma módy hledání – binárním a textovým.

Parametr výraz obsahuje originální řetězec, druhý parametr obsahuje řetězec, který má být nahrazen, třetí pak řetězec, kterým má být nahrazení provedeno. Další parametry jsou volitelné:

začátek - pozice v originálním řetězci, od kterého má být prováděna záměna, pokud jej vynecháme, dosadí se hodnota 1, tedy první znak. Tento parametr musí být použit s dalším parametrem – počet

počet - počet provedení záměr, pokud jej vynecháme, dosadí se hodnota –1, tedy všechny možné substituce. Parametr musí být použit současně s předchozím.

Poslední parametr již známe z předchozích příkazů, určuje nám binární nebo textové hledání.

Příklad použití

Replace("axabcxAxcab", "a", "-")          ‘="-x-bcxAxc-b"
Replace("axabcxAxcab", "a", "-" ,3, 2)    ‘=  "-bcxAxc-b"
Replace("axabcxAxcab", "a", "-" ,3, 1)    ‘=  "-bcxAxcab"
Replace("axabcxAxcab", "a", "-" ,1, -1, 1) ‘="-x-bcx-xc-b"

Filter( vstupní_pole, hledaný_řetězec [, včetně [,typ hledání]] )

Vrací jednorozměrné pole, které je výsledkem filtrování z původního pole. Funkce pracuje s jednorozměrnými poli, přičemž první výsledek najdeme pod indexem 0.

Prvním parametrem určujeme název pole s řetězci, druhý obsahuje hledaný řetězec – filtr. Třetí, volitelný, nicméně důležitý parametr určuje, zda má výsledné pole obsahovat položky vyhovující danému filtru (True), nebo obsahovat položky nevyhovující filtru (False). Poslední parametr definuje typ hledání – textové nebo binární.

Funkci Filter společně s některými dalšími si budeme demonstrovat na příkladě, který je zařazen na konci lekce.

Ostatní funkce

StrReverse( řetězec )

Vrátí řetězec obsahující znaky původního řetězce v opačném pořadí. Pokud obsahuje řetězec Null, funkce vrátí chybu.

  StrReverse(“Ahoj světe !“)      ‘= “! etěvs johA“

Chr( číslo )

Vrátí znak odpovídající danému kódu v ASCII tabulce (American Standard Code for Information Interchange). Prvních 31 znaků je netisknutelných (10 .. odřádkování, viz úvod), znak 32 je mezera a poté začínají znaky vykřičník, uvozovky, ... dále pak číslice, velká a malá písmena atd. Celou ASCII tabulku si můžeme prohlédnut pomocí programu Mapa znaků ve Windows (CHARMAP.EXE) – hodnoty, které se nám objeví u každého znaku, jsou v hexadecimálním tvaru, pro použití ve funkci Chr je musíme převést do tvaru dekadického.

Dnes se nám může tato funkce jevit nepotřebná, ale posléze zjistíme, jak ji můžeme efektně použít například při kódování.

Příklad:

  Response.Write(Chr(65) & Chr(83) & Chr(80)) ‘= “ASP“

Asc( znak )

Funkce inverzní k předchozí. Vrací ordinální hodnotu znaku – argumentu. Pokud je parametr delší než jeden znak, vrací hodnotu prvního, viz příklad.

AscCode = Asc("A")      `=65
AscCode = Asc("a")      `=97
AscCode = Asc("ASP")    `=65

Společný příklad

Na příkladě si předvedeme použití některých funkcí, o kterých jsme si řekli v této a minulé lekci. Účelem skriptu je rozdělení pole jmen na jména ženská a mužská, jejich vypsání, přičemž příjmení bude vypsáno velkými písmeny. Abych demonstroval více funkcí, použil jsem dvě varianty pro funkci, která převádí příjmení na velká písmena. První

Big_surname1 je optimalizovaná a přehledná, tedy tak, jak by měla vypadat :). Funkce Big_surname2, která provádí tutéž činnost, je delší a nepříliš přehledná. Jak vidíme, v programování můžeme dojít k cíli mnohými cestami, ale ne všechny jsou optimální. Rád bych, aby čtenář, který pravidelně sleduje tento seriál, poznal rozdíl a používal vždy první cestu.

Jména efektně roztřídíme pomocí funkce Filter se zapnutým a vypnutým filtrem na přítomnost podřetězce „ová“. Nutno podotknout, že skript není dokonalý, neboť existují jména jako např. Suchá, kdy tento filtr nefunguje. Nicméně filtr „á“ nelze použít, protože by nám našel také všechna mužská jména, kde se vyskytuje dlouhé á. VBS bohužel nepodporuje zástupné znaky * nebo ?

Pár slov k funkci Big_surname1 - funkci předáme parametrem proměnnou name, po deklaraci proměnné Splitted_name do ní vložíme fragmenty proměnné name. Jelikož jsme nezadali oddělovač, funkce použije jako oddělovač mezeru. Poté provedeme převod druhé položky pole na velká písmena. Jak jsme si řekli, výsledky funkce Split začínají indexem 0, proto pracujeme s indexem 1, nikoliv 2. Poté provedeme opětné sloučení pole pomocí funkce Join.

Funkce Big_surname2 definuje tři proměnné – pro křestní jméno, příjmení a pro ukazatel. Do proměnné x dosadíme 1, poté provedeme cyklus, ve kterém testujeme x-tý znak na mezeru. Cyklus se provádí tak dlouho, dokud není prohledán celý řetězec nebo dokud není nalezena mezera. Po ukončení cyklu pomocí Left a Right (mohli bychom použít jen funkci Left) extrahujeme jméno a příjmení. Příjmení převedeme na velká písmena a tyto dvě proměnné pomocí jednoduchého přiřazovacího příkazu sloučíme do výsledné proměnné.


<HTML><HEAD><TITLE>Serial ASP na Zive.cz 9 (spolecny priklad na retezcove funkce)</TITLE></HEAD>
<BODY>

<%
Dim Female_names, Male_names
Dim One_name
Dim Names (5)
Names(0) = "Gertruda Nováková"
Names(1) = "Jarmil Nosil"
Names(2) = "Evžen Lovecký"
Names(3) = "Iris Suchánková"
Names(4) = "Gabriela Blažková"
Names(5) = "Viktor Koželuha"

Female_names = Filter(Names, "ová")
Male_names =  Filter(Names, "ová", false)

Function Big_surname1(name)
  Dim Splitted_name
  Splitted_name = Split(name)
  Splitted_name(1) = UCase(Splitted_name(1))
  Big_surname1 = Join(Splitted_name)
End Function

Function Big_surname2(name)
  Dim First_name, Surname, x, char
  x = 1
  Do while (x < Len(name))
    char = Mid(name,x,1)
    if char = Chr(32) then Exit Do
    x = x + 1
  Loop
  First_name = Left(name,x)
  Surname = Right(name,Len(name)-x)
  Big_surname2 = First_name & " " & UCase(Surname)
End Function
%>

<table border="0" cellspacing="2" cellpadding="1"><tr>
<tr><td colspan="3"><b><div align="center">Rozdìlení na skupiny</div></b></td></tr>
<td valign="top">
<b>Ženy</b><br>
<%
For Each One_name In Female_names
  Response.Write(Big_surname1(One_name) & "<br>")
next
%>
</td><td width=20></td><td valign="top">
<b>Muži</b><br>
<%
For Each One_name In Male_names
  Response.Write(Big_surname2(One_name) & "<br>")
Next
%>
</td></tr></table>

</HTML>

V příští lekci si řekneme něco o funkcích pracujících s čísly, budeme se zabývat některými matematickými operacemi atd. Konečně si řekneme, jak předávat v ASP parametry. Postupně se tak přesuneme od začátků k pokročilému programování.

Diskuze (3) Další článek: Nové doplňky Office na webu

Témata článku: Software, Programování, Fragment, Řetěz, Gertrúda, Textový řetězec, Znak, Velké jméno, Opačné pořadí, ASP, Opera, Mezera, Velký počet, První funkce, FEMA, Viktor, První jméno, Code, Iris, Gabriel, Textové pole, První parametr, Křestní jméno, Funkce, Split


Určitě si přečtěte

Nový Edge je opravdu Chrome! Prohnali jsme prohlížeče benchmarky i vlastním unikátním testem

Nový Edge je opravdu Chrome! Prohnali jsme prohlížeče benchmarky i vlastním unikátním testem

** Nový Edge je postavený na Chromiu ** Prohnali jsme ho benchmarky a srovnali s ostatními ** Potvrdily nám, že je prakticky stejný jako Chrome a Opera

Jakub Čížek | 66

Vyzkoušeli jsme TP-Link Deco P9: zajistí doma Wi-Fi díky drátům ve zdi

Vyzkoušeli jsme TP-Link Deco P9: zajistí doma Wi-Fi díky drátům ve zdi

** Nová generace Mesh Wi-Fi s propojením přes elektrické rozvody ** Lepší parametry a nižší cena než u předchůdce ** Aplikace zatím podporuje jen základní nastavení bez rozšířených funkcí

Tomáš Holčík | 25

Dnes nastal konec Windows 7. Ale nepropadejte panice, počítač vám nastartuje i zítra

Dnes nastal konec Windows 7. Ale nepropadejte panice, počítač vám nastartuje i zítra

** Dnes končí podpora Windows 7 a systém formálně umírá ** Co to ale znamená v praxi a bude mi PC fungovat i zítra? ** A mohu i v lednu 2020 zdarma přejít na Windows 10?

Jakub Čížek | 121



Aktuální číslo časopisu Computer

Velký test autokamer

Test ATX skříní

Jak surfovat pohodlně

Sportovní aplikace

Jak funguje procesor