2011-07-11 17 views
6

języku ActionScript 3.0 (w ciągu Flash CS5)użyciu zmiennej w AS3, Regexp

Standardowa regex pasują do każdej cyfry:

var myRegexPattern:Regex = /\d/g; 

co by regex wyglądać włączyć zmienną string dopasować? (w tym przykładzie jest to „idealne” nie „pracy” fragment) tj:

var myString:String = "MatchThisText" 
var myRegexPatter_WithString:Regex = /\d[myString]/g; 

Widziałem kilka obejścia, które obejmują tworzenie wielu instancji regex, a następnie połączyć je ze źródła, o zmiennej w pytaniu co wydaje się złe. LUB użycie ciągu flash do wyodrębnienia twórcy, ale jest po prostu niechlujny ze wszystkimi potrzebnymi podwójnymi i potrójnymi sekwencjami ucieczki.

Musi być jakiś wolny od bólu sposób, którego nie mogę znaleźć w dokumentach na żywo lub w google. Czy AS3 utrzymuje tę funkcjonalność? Jeśli nie, to naprawdę powinno.

A może brakuje mi prostszego sposobu na uniknięcie tego zadania, że ​​jestem po prostu naiwny z powodu mojej nowości w zakresie regex?

+4

Przypuszczam, że 'nowy RegExp (" \\ d "+ myString," g ")' jest tym, czego chcesz uniknąć? Nie sądzę, że jest inny sposób, ale byłbym zainteresowany, gdyby tak było. – RIAstar

+0

W Perlu można to zrobić za pomocą '/ \ d $ myString/g', ale to jest Perl. ;) – Qtax

+0

@RIASTA: Właśnie chciałem napisać to jako odpowiedź. – shanethehat

Odpowiedz

9

Właściwie to o tym pisałem, więc po prostu wskażę ci tam: http://tyleregeto.com/using-vars-in-regular-expressions-as3 Mówi o możliwych rozwiązaniach, ale nie ma idealnego, o którym wspomniałeś.

EDIT

Oto kopia z najważniejszych części tego wpisu na blogu:

Tutaj jest regex do strip tagi z bloku tekstu.

/<("[^"]*"|'[^']*'|[^'">])*>/ig 

To zręczne wyrażenie działa jak urok. Ale chciałem go zaktualizować, aby deweloper mógł ograniczyć, które znaczniki zostały usunięte do tych określonych w tablicy. Całkiem proste rzeczy, aby użyć wartości zmiennej w wyrażeniu regularnym, musisz najpierw zbudować ją jako ciąg, a następnie przekonwertować. Coś jak poniżej:

var exp:String = 'start-exp' + someVar + 'more-exp'; 
var regex:Regexp = new RegExp(exp); 

Dość prosto do przodu. Więc kiedy podchodziłem do tego małego ulepszenia, to właśnie zrobiłem. Oczywiście jeden duży problem był całkiem jasny.

var exp:String = '/<' + tag + '("[^"]*"|'[^']*'|[^'">])*>/'; 

Zgadnij co, nieprawidłowy ciąg! Lepiej uciec od tych cytatów w łańcuchu. Whoops, to przerwie regex! Byłem zaskoczony. Otworzyłem więc odnośnik do języka, aby zobaczyć, co mogłem znaleźć. Parametr "source", (którego nigdy wcześniej nie używałem) zwrócił moją uwagę. Zwraca łańcuch określony jako "część wzoru wyrażenia regularnego". Zrobiło to doskonale. Oto rozwiązanie:

var start:Regexp = /])*>/ig; 
var complete:RegExp = new RegExp(start.source + tag + end.source); 

Można zmniejszyć go do tego dla wygody:

var complete:RegExp = new RegExp(/])*>/.source + tag, 'ig'); 
+0

+1 dla właściwości "źródło". Nigdy nie słyszałem o tym. – RIAstar

+0

_ "Lepiej uciec tym cudzysłowom w łańcuchu." Ups, to przerwie regex! "_ Nie sądzę. Jeśli unikniesz cudzysłowów w łańcuchu, te wartości są usuwane, gdy łańcuch jest interpretowany, a konstruktor regex nigdy ich nie widzi. – ridgerunner

+0

Ahh to jest piękne! Kopalnia SO wyglądałaby tak: :: nowy RegExp (/ \ d/.source + myString, g); –

6

Jak Tyler słusznie zauważa (i jego odpowiedź działa dobrze), można zainstalować regex jako Koniec ciągu, a następnie przekazuje ten ciąg do konstruktora RegExp ze składnią new RegExp("pattern", "flags").

function assembleRegex(myString) { 
    var re = new RegExp('\\d' + myString, "i"); 
    return re; 
} 

Należy pamiętać, że podczas korzystania ciąg do przechowywania wzorca wyrażenia regularnego, to trzeba dodać jakieś dodatkowe backslashy aby zmusić go do pracy prawo (np dostać \d w regex, trzeba określić \\d w strunowy). Zauważ również, że wzorzec ciągu nie używa przednich ograniczników ukośnika. Innymi słowy, dwa następujące stwierdzenia są równoważne:

var re1 = /\d/ig; 
var re2 = new Regexp("\\d", "ig"); 

Dodatkowa uwaga: może trzeba przetwarzać zmienną myString uciec żadnych backslashy może on zawierać (jeśli mają one być interpretowane jako dosłowny). W takim przypadku funkcja staje się:

function assembleRegex(myString) { 
    myString = myString.replace(/\\/, '\\\\'); 
    var re = new RegExp('\\d' + myString); 
    return re; 
} 
+1

Wierzę, że wspomniałem, że to dokładnie to, czego chciałem uniknąć ... –

+0

@Adrian Seeley: Będziesz musiał uciec od ukośników w zmiennej bez względu na to, które rozwiązanie wybierzesz (i będziesz musiał użyć '' '' nowy RegExp() '). Ale jak pokazałem powyżej, to nic wielkiego - tylko jedno zdanie. Więc domyślam się, że odpowiedź na twoje pytanie brzmi NIE. (I BTW konstruktor 'RegExp' jest rdzenną funkcją JavaScript i nie jest specyficzny dla AS3/Flash.) – ridgerunner

+0

+1 prawidłowe rozwiązanie, ale wszystkie dodatkowe eskapowania sprawiają, że rzeczy są bardziej mylące, moim zdaniem, i znajduję regexp jest dość mylący, zwłaszcza gdy wrócisz kilka miesięcy później. –