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

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

正則表達式是否有辦法來join(和一般的操作)Regex,只有用正則表達式內容涉及(即不會將r修改,彷彿這是內容的一部分)。爲z所需的輸出是:加盟茱莉亞

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

什麼是你得到的輸出? –

+0

@UriMikhli它是第一個代碼塊中的最後一行。 –

+1

好吧,有'正則表達式(join([x.pattern,y.pattern],「|」))',但這不是很漂亮,我不知道它會在更復雜的情況下表現如何。 – DSM

回答

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

的R「報價」運營商實際上編譯爲你的正則表達式這需要時間。如果您只想使用正則表達式的一部分構建更大的正則表達式,則應該使用「普通引號」存儲這些部分。

但是,您所提出的r「quote」與「regular quotes」的粗略轉義規則呢?如果你想粗略的R「引用」規則,但不要馬上編譯一個正則表達式,那麼你可以使用像宏:

macro p_str(s) s end 

現在你有AP「引用」逃脫像R「報價」,但只是返回一個字符串。

不要脫離主題,但你可能會定義一堆引號來繞過棘手的字母。下面是一些方便的:

         # "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" 

當你完成的片段,你可以做你的加入,讓一個正則表達式,如:

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

就像你想。

如果您想了解更多關於什麼成員對象有(如Regex.pattern)嘗試:

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

謝謝邁克爾。看來我的問題的答案是否定的。你的答案包含了一些很酷的東西(我甚至不知道'dump()'),但我已經明白我可以通過操縱字符串部分然後調用'Regex()'來構造正則表達式。然而,我所具體的情況是,當一個人有正則表達式而不是字符串時。我想在這種情況下,你必須使用'模式'。 –

+0

看來,一旦你使用join()來組合p字符串,轉義回覆到它通常在字符串中的東西。所以組合模式畢竟沒有正確的轉義。當然,我可能會錯過一些東西,因爲我是朱莉婭新手。 –