2013-12-09 28 views
7
x = r"abc" 
y = r"def" 
z = join([x,y], "|") 

z # => r"r\"abc\"|r\"def\"" 

Czy istnieje sposób join (iw ogóle manipulować) Regex że zajmuje się tylko zawartością regex (to znaczy nie traktuje modyfikator r jakby to część treści). Pożądana jest wyjście z:Łączenie wyrażeń regularnych w julia

z # => r"abc|def" 
+0

Co jest wyjście dostajesz? –

+0

@UriMikhli Jest to ostatnia linia w pierwszym bloku kodu. –

+1

No cóż, jest 'Regex (join ([x.pattern, y.pattern]," | "))', ale to nie jest bardzo ładne, i nie wiem jak to by się zachowywało w bardziej złożonych przypadkach. – DSM

Odpowiedz

5
macro p_str(s) s end 
x = p"abc" 
y = p"def" 
z = Regex(join([x,y], "|")) 

Operator r „cytat” faktycznie kompiluje wyrażenie regularne dla ciebie, który wymaga czasu. Jeśli masz tylko części wyrażenia regularnego, którego chcesz użyć do zbudowania większego, powinieneś przechowywać części za pomocą "zwykłych cytatów".

A co powiesz na szkicowe reguły ucieczki, które otrzymujesz z "cytatem" a "zwykłymi cytatami", o które pytasz? Jeśli chcesz, szkicowe r zasady „kosztorys”, ale nie od razu skompilować wyrażenia regularnego, a następnie można użyć makra jak:

macro p_str(s) s end 

Teraz masz ap „cytat”, który ucieka jak R „kosztorys”, ale po prostu zwraca ciąg znaków.

Nie można wyłączyć tematu, ale można zdefiniować kilka cytatów, aby pozbyć się skomplikowanych alfabetów. Oto niektóre z nich wygodny:

         # "baked\nescape" -> baked\nescape 
macro p_mstr(s) s end     # p"""raw\nescape""" -> raw\\nescape 
macro dq_str(s) "\"" * s * "\"" end # dq"with quotes" -> "with quotes" 
macro sq_str(s) "'" * s * "'" end  # sq"with quotes" -> 'with quotes' 
macro s_mstr(s) strip(lstrip(s)) end # s""" "stripme" """-> "stripme" 

Po zakończeniu wytwarzania fragmentów można zrobić przyłączyć i uczynić regex jak:

myre = Regex(join([x, y], "|")) 

Tak jak myślałem.

Jeśli chcesz dowiedzieć się więcej o tym, co członkowie jakiś przedmiot (np Regex.pattern) try:

julia> dump(r"pat") 
Regex 
    pattern: ASCIIString "pat" 
    options: Uint32 33564672 
    regex: Array(Uint8,(61,)) [0x45,0x52,0x43,0x50,0x3d,0x00,0x00,0x00,0x00,0x28 … 0x1d,0x70,0x1d,0x61,0x1d,0x74,0x72,0x00,0x09,0x00] 
+0

Dzięki Michael. Wydaje się, że odpowiedź na moje pytanie brzmi: nie. Twoja odpowiedź zawiera kilka fajnych rzeczy (nawet nie wiedziałem o 'dump()'), ale już rozumiem, że mogę konstruować wyrażenia regularne poprzez manipulowanie częściami łańcuchowymi, a następnie wywoływanie 'Regex()'. Specyficzny scenariusz mam jednak, gdy mamy wyrazy regularne, a nie ciągi. Chyba w tym przypadku musisz użyć 'wzorca'. –

+0

Wygląda na to, że gdy użyjesz join() do połączenia ciągów p, zwroty powracają do tego, co normalnie byłoby w ciągu znaków. Tak więc połączony wzór nie ma w końcu prawidłowego ucieczki. Mogę oczywiście czegoś nie zauważyć, ponieważ jestem nowy w Julii. –

Powiązane problemy