Ruby/Wyrażenia regularne: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Szymon wro (dyskusja | edycje)
Szymon wro (dyskusja | edycje)
Linia 46:
Wspólny termin określający wzory które używają tego dziwnych symboli to wyrażenia regularne. W Rubim tak samo jak w Perlu są one zazwyczaj otoczone raczej przez ukośniki niż przez cudzysłowy. Jeżeli nigdy wcześniej nie pracowałeś z wyrażeniami regularnymi, prawdopodobnie wyglądają jak wszystko inne ale nie jak coś regularnego, nie mniej powinieneś być sprytny i poświęcić trochę czasu by się z nimi zaznajomić. Wyrażenia regularne mają skutecznie ekspresywną moc, która oszczędzi ci bólów głowy (i wielu linii kodu) niezależnie od tego, czy potrzebujesz dopasowywania wzorców, wyszukiwania czy też innego manipulowania łańcuchami.
 
Dla przykładu, przypuśćmy, że chcemy sprawdzić czy łańcuch pasuje do tego opisu: "Zaczyna się małą literą ''f'', po której zaraz następuje jedna duża litera i opcjonalnie jakieś inne znaki, aż do wystąpienia innych innych małych liter." Jeżeli jesteś doświadczonym programistą C, prawdopodobnie już napisałemnapisałeś około tuzina linii kodu w głowie, prawda? Przyznaj to; prawie nie możesz sobie poradzić. Ale w Rubim potrzebujesz jedynie by twój łańcuch został sprawdzony na występowanie wyrażenia regularnego /^f[A-Z][^a-z]*$/.
 
A co z "Zawiera heksadecymalny numer w ostrych nawiasach"? Żaden problem.
 
<pre>
ruby> def chab(s) # "containszawiera hex inw angleostrych bracketsnawiasach"
| (s =~ /<0(x|X)(\d|[a-f]|[A-F])+>/) != nil
| end
Linia 57:
ruby> chab "Not this one."
false
ruby> chab "Maybe this? {0x35}" # wrongzły kindrodzaj of bracketsnawiasów
false
ruby> chab "Or this? <0x38z7e>" # bogusfałszywa hexliczba digithex
false
ruby> chab "Okay, this: <0xfc0004>."
Linia 67:
Chociaż wyrażenia regularne mogą wydawać się zagadkowe przy pierwszym spojrzeniu, z pewnością szybko osiągniesz satysfakcję z możliwości wyrażania się tak ekonomicznie.
 
HereOto is a littlemały program toktóry helppomoże youci experimenteksperymentować withz regularwyrażeniami expressionsregularnymi. StoreZapisz itgo asjako ''regx.rb'' andi runuruchom itprzez by typingwpisanie "ruby regx.rb" at thew commandlinii linepoleceń.
 
<pre>
# Requires an ANSI terminal!
# Wymaga terminala ANSI!
 
st = "\033[7m"
Linia 84 ⟶ 85:
puts str.gsub(re,"#{st}\\&#{en}")
end
</pre>
 
Program wymaga dwukrotnego wprowadzenia danych, raz oczekuje na łańcuch tekstowy a raz na wyrażenie regularne. Łańcuch jest sprawdzany pod kątem występowania wyrażenia regularnego, następnie wypisywany z podświetlonymi wszystkimi pasującymi fragmentami. Nie analizuj teraz szczegółów; analiza tego kodu wkrótce się pojawi.
The program requires input twice, once for a string and once for a regular expression. The string is tested against the regular expression, then displayed with all the matching parts highlighted in reverse video. Don't mind details now; an analysis of this code will come soon.
 
<pre>
str> foobar
pat> ^fo+
foobar
~~~
[[Wikipedysta:83.21.38.165|83.21.38.165]]
</pre>
 
Znaki tyldy oznaczają podświetlony tekst na wyjściu programu.
What you see above as red text will appear as reverse video in the program output. The "[[Wikipedysta:83.21.38.165|83.21.38.165]]" lines are for the benefit of those using text-based browsers.
 
Wypróbujmy kilka innych tekstów.
Let's try several more inputs.
 
</pre>
str> abc012dbcd555
pat> \d
abc012dbcd555
[[Wikipedysta:83.21.38.165Szymon wro|83.21.38.165Szymon Wro]] [[Wikipedysta:83.21.38.165Szymon wro|83.21.38.165Szymon Wro]]
</pre>
 
If that surprised you, refer to the table at the top of this page: \d has no relationship to the character d, but rather matches a single digit.