2009-08-01 11 views
7

Próbuję znaleźć sposób, aby umożliwić mi dynamicznie utworzyć obiekt regexp z ciąg (pobierane z bazy danych), a następnie użyć go do filtrowania innego ciągu. Ten przykład ma na celu wyodrębnienie danych z komunikatu zatwierdzenia git, ale teoretycznie każde prawidłowe wyrażenie regularne może być obecne w bazie danych jako ciąg znaków.Dynamic Regex w Ruby

Co dzieje

>> string = "[ALERT] Project: Revision ...123456 committed by Me <[email protected]>\n on 2009- 07-28 21:21:47\n\n Fixed typo\n" 
>> r = Regexp.new("[A-Za-z]+: Revision ...[\w]+ committed by [A-Za-z\s]+") 
>> string[r] 
=> nil 

Co chcę się zdarzyć

>> string = "[ALERT] Project: Revision ...123456 committed by Me <[email protected]>\n on 2009- 07-28 21:21:47\n\n Fixed typo\n" 
>> string[/[A-Za-z]+: Revision ...[\w]+ committed by [A-Za-z\s]+/] 
=> "Project: Revision 123456 committed by Me" 

Odpowiedz

11

Brakuje tylko jedno:

>> Regexp.new "\w" 
=> /w/ 
>> Regexp.new "\\w" 
=> /\w/ 

backslashes jest znaków escape w łańcuchach. Jeśli chcesz dosłowny ukośnik odwrotny, musisz go podwoić.

>> string = "[ALERT] Project: Revision ...123456 committed by Me <[email protected]>\n on 2009- 07-28 21:21:47\n\n Fixed typo\n" 
=> "[ALERT] Project: Revision ...123456 committed by Me <[email protected]>\n on 2009- 07-28 21:21:47\n\n Fixed typo\n" 
>> r = Regexp.new("[A-Za-z]+: Revision ...[\\w]+ committed by [A-Za-z\\s]+") 
=> /[A-Za-z]+: Revision ...[\w]+ committed by [A-Za-z\s]+/ 
>> string[r] 
=> "Project: Revision ...123456 committed by Me " 

Zazwyczaj gdybyś wklejony wyjście ze swoimi „broken” linii, a nie tylko na wejście, to pewnie zauważyli, że w i s nie uciekł prawidłowo

+0

Perfect, dzięki - Wiedziałem, że muszę robić coś subtelnie złego. – davidsmalley

0

Option 1:

# Escape the slashes: 
r = Regexp.new("[A-Za-z]+: Revision ...[\\w]+ committed by [A-Za-z\\s]+") 

Wada ręczne ucieczki wszystkie znane postacie ucieczki

Opcja 2:

# Use slashes in constructor 
r = Regexp.new(/[A-Za-z]+: Revision ...[\w]+ committed by [A-Za-z\s]+/) 

Wada: Brak

+0

Dla opcji 2 - argumentem dla konstruktora jest zawsze ciąg, ponieważ regex jest pobierany z bazy danych, więc nie będzie działać w tym scenariuszu. – davidsmalley