Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Programování v C# Soubory a regulární výrazy
Petr Vaněček
1 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Obsah přednášky
I
Informace o prostředí
I
Práce se soubory
I
Regulární výrazy
2 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Zprostředkování informací
I
Třída System.Environment I
Poskytuje info o systému, procesu, uživateli, . . .
3 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Systém a verze
I
OSVersion I
I
I
I
uživatelské jméno vlastníka procesu
UserDomainName I
I
verze runtimu
UserName I
I
informace o platformě a verzi
Version
název domény
MachineName I
název počítače
4 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Cesty I
CurrentDirectory I
I
I
I
systémový adresář (většino c:/windows/system32)
GetFolderPath(SpecialFolder) I I I I I I
I
aktuální adresář
SystemDirectory
cesty ke speciálním adresářům ApplicationData – data aplikací Desktop – plocha MyMusic – hudba StartMenu – nabídka start ...
GetCommandLineArgs I
parametry příkazové řádky včetně jména souboru
5 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Proudy
I I
V .NET všechny I/O operace řešeny pomocí proudů Třída System.IO.Stream I
abstraktní pohled na množinu bytů I I I I
I
společné metody I I
I
soubor paměť TCP/IP ... Read Write
u některých proudu navíc náhodný přístup I I
metoda Seek vlastnost Position
6 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Třída FileStream
I I
Pro práci se soubory Otevření souboru probíhá v konstruktoru I I
FileStream soubor = new FileStream(string, FileMode); FileMode určuje způsob otevření I I
I
I
Create – vytvoří či přepíše soubor Append – otevře existující soubor a zapisuje na jeho konec nebo vytvoří nový soubor Open – otevře existující soubor
Při zápisu se využívá buffer I I
nutno korektně uzavřít soubor Close
7 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Příklad použití třídyFileStream FileStream fs = null ; try { fs = new FileStream ( " prvni " , FileMode . Create ); byte [] s = new byte []{( byte ) ’p ’}; fs . Write (s ,0 ,1); } finally { fs . Close (); }
nebo using ( fs = new FileStream ( " prvni " , FileMode . Create )) { byte [] s = new byte []{( byte ) ’p ’}; fs . Write (s ,0 ,1); } 8 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Třídy BinaryWriter/Reader
I I
Práce s binárními daty Konstruktory I I
I I
Implementují metody pro práci se základními typy ... Read...() I I
I
BinaryReader/Writer(Stream, Encoding) možnost nastavit použité kódování
načte z proudu hodnotu byte ReadByte()
void Write() I
zapíše do proudu data
9 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Třídy TextReader/Writer
I I
Práce s textem Odděděné třídy I
StringReader/Writer I
I
StreamReader/Writer I
I
čtení/zápis do proudu
Konstruktory I
I
čtení/zápis do řetězce
StreamReader/Writer(string/Stream, Encoding)
Metody Read/WriteLine
10 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Příklad použití tříd StreamReader/Writer
using ( StreamWriter soubor = new StreamWriter ( " pokus " , false , Encoding . UTF8 )) { soubor . WriteLine ( " můžeme psát česky " ); } using ( StreamReader soubor = new StreamReader ( " pokus " , Encoding . UTF8 )) { string retezec = soubor . ReadLine (); Console . WriteLine ( retezec ); }
11 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Třídy File a FileInfo I
Obsahují metody pro práci se soubory I
I I
Třída File obsahuje statické metody Třída FileInfo obsahuje instanční metody I
I
vyplatí se při více operacích nad jedním souborem – nedochází k opakované kontrole práv
Diskové operace I I I
I
otevírání, kopírování, mazání, . . .
metoda MoveTo – přesun souboru metoda CopyTo – kopírování metoda Delete – mazání
Zjišťování a nastavování přístupu I I
vlastnost LastAccessTime – poslední přístup vlastnost Attributes – atributy
12 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Třídy File a FileInfo v .NET 2
I I
Zjednodušení práce se soubory Načtení a zápis celého souboru pomocí jedné metody I I I I
string ReadAllText string[] ReadAllLines WriteAllText(string) WrtieAllLines(string[])
13 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Třídy Directory a DirectoryInfo
I I
Dvě verze podobně jako u souborů Umožňují operace s adresáři I I
I
Zjištění obsahu adresáře I I
I I
Delete Move GetDirectories GetFiles
Zjišťování a nastavování přístupu Změna aktuálního adresáře I
SetCurrentDirectory
14 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Práce s cestami
I
Třída Path
I
Pracuje pouze s řetězcem Umožňuje získávat a měnit části cesty
I
I I I I I I
GetExtension – vrátí příponu ChangeExtension – vrátí cestu se změněnou příponou HasExtension – rozhodne zda cesta obsahuje i příponu GetFileName – jméno souboru GetDirectoryName – jméno adresáře ...
15 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Příklad
string soubor = Environment . Ge tCom mand LineArgs ()[0]; soubor = Path . ChangeExtension ( soubor , " . cs " ); if ( File . Exists ( soubor )) { string [] radky = File . ReadAllLines ( soubor ); foreach ( string radka in radky ) { Console . WriteLine ( radka ); } }
16 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Hlídání souborů
I
Třída FileSystemWatcher I
I
Vyvolává události I I I I
I
sleduje změny v nastaveném adresáři Changed Created Deleted Renamed
– – – –
změna vytvoření smazání přejmenování
Pomocí vlastností Filter a NotifyFilter možno nastavit jaké události a které soubory se mají sledovat
17 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Hlídání souborů – příklad public static void Main ( string [] Args ) { string cesta = Environment . G et Co mm an dL in eArgs ()[0]; cesta = Path . GetDirectoryName ( cesta ); FileSyste mWatc her hlidac = new Fil eSyste mWatcher ( cesta ); hlidac . Created += new F i l e S y s t e m E v e n t H a n d le r ( Vytvoreni ); hlidac . E na b l e Ra i s in g E ve n t s = true ; Console . WriteLine ( " Tady hlidam ja " ); Console . ReadKey (); } private static void Vytvoreni ( object source , FileSyst e m E ve n t Ar g s e ) { Console . WriteLine ( " Vytvoril se : " + e . FullPath ); }
18 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Co jsou vlastně zač?
I
Co jsou regulární výrazy?
19 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Co jsou vlastně zač?
I
Co jsou regulární výrazy? I I I I
univerzální pomocník při práci s textem vyhledávání rozdělování nahrazování
19 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Co jsou vlastně zač?
I
Co jsou regulární výrazy? I I I I
I
univerzální pomocník při práci s textem vyhledávání rozdělování nahrazování
Jak to vypadá?
19 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Co jsou vlastně zač?
I
Co jsou regulární výrazy? I I I I
I
univerzální pomocník při práci s textem vyhledávání rozdělování nahrazování
Jak to vypadá? I
kombinace normálních a řídících znaků, které definují vzor (pattern)
19 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Co jsou vlastně zač?
I
Co jsou regulární výrazy? I I I I
I
Jak to vypadá? I
I
univerzální pomocník při práci s textem vyhledávání rozdělování nahrazování kombinace normálních a řídících znaků, které definují vzor (pattern)
A v praxi?
19 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Co jsou vlastně zač?
I
Co jsou regulární výrazy? I I I I
I
Jak to vypadá? I
I
univerzální pomocník při práci s textem vyhledávání rozdělování nahrazování kombinace normálních a řídících znaků, které definují vzor (pattern)
A v praxi? I
např. I I
e – vyhledá písmeno ”e” eva – vyhledá řetězec ”eva”
19 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Více znaků
I
Libovolný znak
20 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Více znaků
I
Libovolný znak I
e.a – eva, ema, esa, . . .
20 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Více znaků
I
Libovolný znak I
I
e.a – eva, ema, esa, . . .
Množina znaků
20 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Více znaků
I
Libovolný znak I
I
e.a – eva, ema, esa, . . .
Množina znaků I I
e[vm]a – eva,ema e[^m]a – eva, esa, eta, (ne ema)
20 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Více znaků
I
Libovolný znak I
I
Množina znaků I I
I
e.a – eva, ema, esa, . . . e[vm]a – eva,ema e[^m]a – eva, esa, eta, (ne ema)
Speciální znaky
20 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Více znaků
I
Libovolný znak I
I
Množina znaků I I
I
e.a – eva, ema, esa, . . . e[vm]a – eva,ema e[^m]a – eva, esa, eta, (ne ema)
Speciální znaky I I I
\w – alfanumerický znak \d – číslo \s – bílý znak (mezera, tabulátor, . . . )
20 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Více znaků
I
Libovolný znak I
I
Množina znaků I I
I
e[vm]a – eva,ema e[^m]a – eva, esa, eta, (ne ema)
Speciální znaky I I I
I
e.a – eva, ema, esa, . . .
\w – alfanumerický znak \d – číslo \s – bílý znak (mezera, tabulátor, . . . )
A tečka?
20 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Více znaků
I
Libovolný znak I
I
Množina znaků I I
I
e[vm]a – eva,ema e[^m]a – eva, esa, eta, (ne ema)
Speciální znaky I I I
I
e.a – eva, ema, esa, . . .
\w – alfanumerický znak \d – číslo \s – bílý znak (mezera, tabulátor, . . . )
A tečka? I
\.
20 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Skupiny
I I
(vzor) – se skupinami možno dále pracovat Jednotlivé skupiny jsou číslovány (celý výraz má číslo 0) I
\číslo – zopakování skupiny ve výrazu I
(.)\1
21 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Skupiny
I I
(vzor) – se skupinami možno dále pracovat Jednotlivé skupiny jsou číslovány (celý výraz má číslo 0) I
\číslo – zopakování skupiny ve výrazu I
(.)\1 – dva po sobě jdoucí shodné znaky
21 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Skupiny
I I
(vzor) – se skupinami možno dále pracovat Jednotlivé skupiny jsou číslovány (celý výraz má číslo 0) I
\číslo – zopakování skupiny ve výrazu I
I
(.)\1 – dva po sobě jdoucí shodné znaky
$číslo – použití skupiny při nahrazování I
Replace "(.)(.)", "$2$1"
21 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Skupiny
I I
(vzor) – se skupinami možno dále pracovat Jednotlivé skupiny jsou číslovány (celý výraz má číslo 0) I
\číslo – zopakování skupiny ve výrazu I
I
(.)\1 – dva po sobě jdoucí shodné znaky
$číslo – použití skupiny při nahrazování I
Replace "(.)(.)", "$2$1" – prohození pořadí každých dvou znaků
21 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Skupiny
I I
(vzor) – se skupinami možno dále pracovat Jednotlivé skupiny jsou číslovány (celý výraz má číslo 0) I
\číslo – zopakování skupiny ve výrazu I
I
I
I
(.)\1 – dva po sobě jdoucí shodné znaky
$číslo – použití skupiny při nahrazování Replace "(.)(.)", "$2$1" – prohození pořadí každých dvou znaků
Skupiny je možné pojmenovat I I I
(?<jmeno>vzor) – pojmenování \<jmeno> – definice vzoru ${jmeno} – nahrazování
21 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Další možnosti vyhledávání
I
vzor1|vzor2 – spojka nebo I
(em|iv)a – ema nebo iva
I
^ – začátek řetězce
I
$ – konec řetězce \b – začátek/konec slova
I
I
\e[^\s]* – celé slovo (ukončené mezerou)
22 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Opakování
I
* – opakování vzoru (0-n)
I
+ – opakování vzoru (minimálně jednou)
I
? – výskyt vzoru 0 nebo 1 krát
I
{počet} – pevný počet opakování
I
{min,max} – pevný počet opakování (rozmezí) Příklad: ”mama ma maso”
I
I I I I I
(ma)* - mama ma maso m.*m - mama ma maso ma\s*ma - mama ma maso ma\s+ma - mama ma maso (ma.?){3} - mama ma maso
23 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Regulární výrazy v .NETu
I I
Namespace System.Text.RegularExpression Třída Regex I I I I I I
I
obsahuje statické i nestatické metody Match – vyhledá vzor a vrátí první výskyt Matches – vyhledá vzor a vrátí všechny výskyty IsMatch – zjistí zda se vzor v řetězci nachází Split – podle vzoru rozdělí řetězec na pole řetězců Replace – vyhledá vzory a nahradí je řetězcem
Pokud nejsou nutné regulární výrazy, použít metody třídy String I I I
IndexOf – vyhledání Split – rozdělení Replace – nahrazení
24 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Možnosti nahrazování I
Metoda Replace existuje v několika exemplářích I
možnost definovat vlastní metodu, která bude provádět složitější operace static string NaKila ( Match m ) { string cislo = m . Groups [1]. ToString (); int velikost = int . Parse ( cislo ); velikost /= 1024; return velikost . ToString ()+ " kB " ; } ... string vysledek = Regex . Replace ( text , @ " (\ d +) B " , new MatchEvaluator ( NaKila ));
25 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Pár příkladů na závěr
I
Rodné číslo ( 000000/000? )
26 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Pár příkladů na závěr
I
Rodné číslo ( 000000/000? ) I
\d{6}/\d{3,4}
26 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Pár příkladů na závěr
I
Rodné číslo ( 000000/000? ) I
I
\d{6}/\d{3,4}
IP adresa ( 0??.0??.0??.0?? )
26 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Pár příkladů na závěr
I
Rodné číslo ( 000000/000? ) I
I
\d{6}/\d{3,4}
IP adresa ( 0??.0??.0??.0?? ) I
\d{1,3}(\.\d{1,3}){3}
26 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Pár příkladů na závěr
I
Rodné číslo ( 000000/000? ) I
I
IP adresa ( 0??.0??.0??.0?? ) I
I
\d{6}/\d{3,4} \d{1,3}(\.\d{1,3}){3}
PSČ
26 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Pár příkladů na závěr
I
Rodné číslo ( 000000/000? ) I
I
IP adresa ( 0??.0??.0??.0?? ) I
I
\d{6}/\d{3,4} \d{1,3}(\.\d{1,3}){3}
PSČ I
\d{3} ?\d{2}
26 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Pár příkladů na závěr
I
Rodné číslo ( 000000/000? ) I
I
IP adresa ( 0??.0??.0??.0?? ) I
I
\d{1,3}(\.\d{1,3}){3}
PSČ I
I
\d{6}/\d{3,4}
\d{3} ?\d{2}
email (
[email protected] )
26 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Pár příkladů na závěr
I
Rodné číslo ( 000000/000? ) I
I
IP adresa ( 0??.0??.0??.0?? ) I
I
\d{1,3}(\.\d{1,3}){3}
PSČ I
I
\d{6}/\d{3,4}
\d{3} ?\d{2}
email (
[email protected] ) I
[\w. -]+@[\w.-]+\.[a-zA-Z]{2,4}
26 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Pár příkladů na závěr
I
Rodné číslo ( 000000/000? ) I
I
IP adresa ( 0??.0??.0??.0?? ) I
I
\d{1,3}(\.\d{1,3}){3}
PSČ I
I
\d{6}/\d{3,4}
\d{3} ?\d{2}
email (
[email protected] ) I I I
[\w. -]+@[\w.-]+\.[a-zA-Z]{2,4} není 100% korektní vyhledávání vs. testování
26 / 27
Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec
Konec
27 / 27