<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>&#60;?blog &#187; like</title>
	<atom:link href="http://blog.visionsoftware.pl/tag/like/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.visionsoftware.pl</link>
	<description>...nie tylko o programowaniu</description>
	<lastBuildDate>Sun, 23 Mar 2014 19:23:43 +0000</lastBuildDate>
	<language>pl-PL</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	
	<item>
		<title>Wyrażenia regularne w MySQL</title>
		<link>http://blog.visionsoftware.pl/bazy-danych/wyrazenia-regularne-w-mysql.html</link>
		<comments>http://blog.visionsoftware.pl/bazy-danych/wyrazenia-regularne-w-mysql.html#comments</comments>
		<pubDate>Thu, 06 Jan 2011 14:33:42 +0000</pubDate>
		<dc:creator><![CDATA[Marcin Fliszta]]></dc:creator>
				<category><![CDATA[Bazy danych]]></category>
		<category><![CDATA[like]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[regexp]]></category>
		<category><![CDATA[wyrażenia regularne]]></category>

		<guid isPermaLink="false">http://blog.visionsoftware.pl/?p=132</guid>
		<description><![CDATA[Raz na jakiś czas zachodzi potrzeba wyszukania w bazie danych w określonym formacie.  Często wystarcza do tego celu zwykłe LIKE, jednak konstrukcja taka nie pomoże w bardziej skomplikowanych przypadkach. Wtedy warto skorzystać z REGEXP, dzięki czemu wykorzystamy możliwości wyrażeń regularnych. Podstawowym sposobem na wyszukiwania według określonego formatu jest w MySQL konstrukcja LIKE. Możemy w niej skorzystać z następujących konstrukcji: _ &#8211; każdy pojedynczy znak % &#8211; wiele dowolnych znaków (włączając w to ich brak) Przykładowe [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Raz na jakiś czas zachodzi potrzeba wyszukania w bazie danych w określonym formacie.  Często wystarcza do tego celu zwykłe LIKE, jednak konstrukcja taka nie pomoże w bardziej skomplikowanych przypadkach. Wtedy warto skorzystać z REGEXP, dzięki czemu wykorzystamy możliwości wyrażeń regularnych.<span id="more-132"></span></p>
<p>Podstawowym sposobem na wyszukiwania według określonego formatu jest w MySQL konstrukcja LIKE. Możemy w niej skorzystać z następujących konstrukcji:</p>
<ul>
<li>_ &#8211; każdy pojedynczy znak</li>
<li>% &#8211; wiele dowolnych znaków (włączając w to ich brak)</li>
</ul>
<p>Przykładowe zapytanie:</p>
<pre class="brush: sql; title: ; notranslate">select x from tabela where y like &quot;a_cd%h&quot;;</pre>
<p>zwróci wszystkie rekordy, dla których kolumna “x” rozpoczyna się od znaku &#8222;a&#8221;, po którym występuje jeden dowolny znak, następnie ciąg &#8222;cd&#8221;, nieokreślona liczba dowolnych znaków i na końcu znak &#8222;h&#8221;.</p>
<p>Takie wyszukiwania są jednak mocno ograniczone, często potrzebujemy wyboru bardziej szczegółowego formatu. Z pomocą mogą tu przyjść wyrażenia regularne, z którym możemy korzystać w MySQL poprzez konstrukcje REGEXP oraz NOT REGEXP (lub ich synonimy RLIKE oraz NOT RLIKE). W MySQL obowiązuje format Perla, czyli na przykład:</p>
<pre class="brush: sql; title: ; notranslate">select * from tabela where pole regexp '^[a-c]{1,3}X[0-9]*';</pre>
<p>Wyrażenia regularne w MySQL mogą zawierać następujące konstrukcje:</p>
<ul>
<li>^ &#8211; wyrażanie regularne rozpoczyna się od zdefiniowanego wzorca, np. ^x oznacza dowolny ciąg zaczynający się od znaku &#8222;x&#8221;</li>
<li>$ &#8211; wyrażanie regularne kończy się na zdefiniowanym wzorcu, np. x$ oznacza dowolny ciąg kończący się znakiem &#8222;x&#8221;</li>
<li>. &#8211; dowolny pojedynczy znak</li>
<li>* &#8211; zero lub więcej znaków, po jakim została umieszczona gwiazdka, np. x* oznacza dowolną liczbę wystąpień litery &#8222;x&#8221;, [0-9]* oznacza dowolną liczbę wystąpień jakiejkolwiek cyfry, (abc)* dowolną liczbę wystąpień ciągu &#8222;abc&#8221;, natomiast .* dowolny ciąg znaków</li>
<li>+ &#8211; jedno lub więcej wystąpienie określonego ciągu po jakim został umieszczony +, np. x+ oznacza jeden lub więcej &#8222;x&#8221;, [a-c]+ oznacza jedną lub więcej literę a, b lub c</li>
<li>? &#8211; zero lub jedno wystąpienie poprzedzającego znaku, np. x? oznacz zero lub jedno wystąpienie znaku &#8222;x&#8221;</li>
<li>[..] &#8211; zakres znaków, np. [a-zA-GXYZ5-9] oznacza wszystkie małe litery, duże od A do G oraz X, Y, Z, cyfry od 5-9. Można stosować zaprzeczenie poprzez ^, np. [^3-5] oznacza wszystkie ciągi, które nie zawierają liczb 3, 4 oraz 5.</li>
<li>| &#8211; logiczne lub, np. abc|def oznacza ciąg abc lub def</li>
<li>{n}, {n, m} &#8211; określa liczbę wystąpień poprzedzającego wyrażenia, np. a{4} oznacza znak &#8222;a&#8221; występujący dokładnie 4 razy, [a-c]{2,3} oznacza znak a, b lub c występujący od 2 do 3 razy. Można także stosować konstrukcję {0,}, która jest tożsama z operatorem * oraz {1,}, który oznacza to samo co +</li>
</ul>
<p>Aby użyć znaku specjalnego (+, -, *, &amp;, itp) musimy posłużyć się podwójnymi slashami. Przykładowo, aby odnaleźć ciąg 1+2 należy zastosować wyrażenie regularne w postaci 1\\+2.</p>
<p>Znaki w wyrażaniach regularnych możemy pisać wprost ([abc], \\+, \\’ itp.) lub stosując specjalną konstrukcję w postaci [.znaki.] . Przykładowo, aby znaleźć ciągi zawierające tyldę możemy posłużyć się zapytaniami:</p>
<pre class="brush: sql; title: ; notranslate">
SELECT x FROM tabela REGEXP '\\~';
SELECT x FROM tabela REGEXP '[[.~.]]';
SELECT x FROM tabela REGEXP '[[.tilde.]]';

</pre>
<p>Tego typu zapisów jest dość sporo, przykładowe to:</p>
<ul>
<li>newline &#8211; nowa linia \n</li>
<li>tab &#8211; tabulacja \t</li>
<li>apostrophe &#8211; pojedynczy apostrof ‚</li>
<li>carriage-return &#8211; znak powrotu karetki \r</li>
<li>plus-sign &#8211; znak &#8222;plus&#8221; +</li>
</ul>
<p>Można także stosować klasy znaków, zawierające okresloną grupę wzorców. Na przykład [:alnum:] oznacza wszystkie znaki alfanumeryczne. Inne możliwości są następujące:</p>
<ul>
<li>alnum &#8211; znaki alfanumeryczne</li>
<li>alpha &#8211; litery alfabetu</li>
<li>blank &#8211; białe znaki</li>
<li>cntrl &#8211; znaki kontrolne</li>
<li>digit &#8211; cyfry</li>
<li>graph &#8211; znaki graficzne</li>
<li>lower &#8211; małe litery alfabetu</li>
<li>print &#8211; znaki graficzne lub spacje</li>
<li>punct &#8211; znaki interpunkcyjne</li>
<li>space &#8211; spacja, tabulacja, znak nowej linii oraz powrotu karetki</li>
<li>upper &#8211; duże litery alfabetu</li>
<li>xdigit &#8211; znaki heksadecymalne</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.visionsoftware.pl/bazy-danych/wyrazenia-regularne-w-mysql.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
