Czasem komentarz na blogu może być inspiracją do napisania nowej notki. Jakiś czas temu opisałem symbole wieloznaczne w programie Word (symbole wieloznaczne to taka namiastka wyrażeń regularnych). Pod wpisem pojawił się komentarz z pytaniem, które jest tytułem tego wpisu.
Gdy kopiujesz jakiś fragment tekstu z Wikipedii często jest w nim pełno przypisów. Oto przykładowy fragment wpisu z Wikipedii:
Kot domowy (Felis catus[1][3], również Felis silvestris catus) – udomowiony gatunek ssaka z rzędu drapieżnych z rodziny kotowatych. Koty zostały udomowione około 9500 lat temu[4] i są obecnie najpopularniejszymi zwierzętami domowymi na świecie[5]. Gatunek ten prawdopodobnie pochodzi od kota nubijskiego, przy czym w Europie krzyżował się ze żbikiem. Przez IUCN/SSC jest uznawany za gatunek inwazyjny[6].
Jak widzimy w tych kilku linijkach znajduje się aż 6 przypisów. Wszystkie przypisy mają pewną wspólną cechę: otóż zaczynają się od kwadratowego nawiasu otwierającego, następnie są cyfry i kończą się kwadratowym nawiasem zamykającym.
Czytelnik mojego bloga miał problem z wymyśleniem odpowiedniego wyrażenia. I na początku ja też. Zacznijmy od czegoś prostszego: każdy przypis to nic innego jak liczba. Załóżmy, że raczej nie ma więcej niż kilkaset przypisów w nawet najdłuższym artykule. Więc nasze wyrażenie z symbolami wieloznacznymi mogłoby wyglądać tak:
[0-9]{1;3}
Czyli usuń wszystkie ciągi znaków składające się z cyfr z zakresu od 0 do 9 o długości od 1 do 3 cyfr.

Niestety, ale to wyrażenie ma dwie wady. Po pierwsze z tekstu zostaną usunięte wszystkie cyfry (również te nie będące pomiędzy kwadratowymi nawiasami) po drugie po takiej operacji zostałyby samotne kwadratowe nawiasy tj. ciąg znaków [1] zostałby zamieniony na [].
Tutaj pojawia się problem – jak ująć te nawiasy w naszym wyrażeniu? W przypadku symboli wieloznacznych znak [ pełni specjalną funkcję (wewnątrz kwadratowych nawiasów umieszczamy np. przedział znaków jakie mają być w naszym wzorcu np. [A-Z]) to trzeba jakoś poinformować Worda, że ten znak [ co chcę wpisać to nie ma być np. początek jakiegoś przedziału a dosłownie chcę z tekstu wyłowić znak [. Tak więc poniższe wyrażenie jest błędne:
[[0-9]{1;3}]
Na początku kombinowałem z jakimś „znakiem ucieczki”. W klasycznych wyrażeniach regularnych jest to znak \. Niestety, ale tutaj to nie zadziałało. Również znak ^ który czasem w symbolach wieloznacznych pełni różne specjalne funkcje tutaj się nie sprawdził.
Ale wpadłem na pewien pomysł. Otóż w kwadratowych nawiasach można zamieszczać albo przedziały znaków takie jak np. [A-Z] albo poszczególne znaki np. wyrażenie k[aoi]t spowoduje że program Word dopasuje do wzorca następujące wyrazy: kot, kat, kit.
Tak więc wpadłem na pomysł: a co by było gdybym w kwadratowych nawiasach umieścił porządny przeze mnie znak nawiasu kwadratowego? O dziwo to rozwiązanie zadziałało. Czyli mój wzorzec składa się z 3 części:
- [[] – ciąg znaków musi się zaczynać od znaku [
- [0-9]{1;3} – potem ma się znajdować liczba składająca się od 1 do 3 cyfr
- []] – wyrażenie musi być zakończone znakiem ]
A więc moje wyrażenie wygląda następująco:
[[][0-9]{1;3}[]]
I w ten oto sposób możemy sprytnie hurtowo usunąć z tekstu wszystkie przypisy.