W jaki sposób jeden skutecznie dopasować jeden ciąg wejściowy do dowolnej liczby wyrażeń regularnych?Jak skutecznie dopasować ciąg wejściowy do kilku wyrażeń regularnych jednocześnie?
Jeden scenariusz, w którym może być przydatny, dotyczy usług internetowych REST. Załóżmy, że mam wymyślić wiele wzorców adresów URL do publicznego interfejsu REST Web Service za:
/user/with-id/
{userId}
/user/with-id/
{userId}
/profile
/user/with-id/
{userId}
/preferences
/users
/users/who-signed-up-on/
{date}
/users/who-signed-up-between/
{fromDate}
/and/
{toDate}
- ...
gdzie {…}
noszą nazwy zastępcze (jak wyrażenie regularne grupy przechwytywania).
Uwaga: to pytanie nie jest o tym, czy powyższy interfejs reszta jest dobrze zaprojektowany, czy nie. (To chyba nie jest, ale to nie powinno mieć znaczenia w kontekście tego pytania.)
to można przyjąć, że zastępcze zwykle nie pojawiają się na samym początku wzorca (ale mogli). Można również bezpiecznie założyć, że żaden ciąg nie może pasować do więcej niż jednego wzoru.
Teraz usługa internetowa otrzymuje żądanie. Oczywiście można sekwencyjnie dopasować żądany URI do jednego wzorca URL, a następnie do następnego, i tak dalej; ale to prawdopodobnie nie będzie dobrze skalowane w przypadku większej liczby wzorów, które należy sprawdzić.
Czy istnieją skuteczne algorytmy?
Wejścia:
- Ciąg wejściowy
- Zestaw "wzajemnie wykluczających" wyrażeń regularnych (to znaczy nie ciąg wejściowy może pasować do więcej niż jednego wyrażenia.)
Output :
- Wyrażenie regularne (jeśli występuje), do którego dopasowano ciąg wejściowy.
czy istnieje taka możliwość w C++? – nurettin
http://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_string_matching_algorithm zawiera linki do kilku implementacji. Pamiętam, że http://sourceforge.net/projects/snort/ miał implementację w C gdzieś, ale to było wiele lat temu, mógłbym się mylić. –
Znalazłem, że biblioteka re2 Google google może dopasować wyrażenia regularne za pomocą algorytmu Aho-Corasick – nurettin