在Julia中连接正则表达式

10
x = r"abc"
y = r"def"
z = join([x,y], "|")

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

有没有一种方法可以连接(并且通常操作)仅处理正则表达式内容的Regex(即不将r修饰符视为其内容的一部分)。对于z的期望输出是:

z # => r"abc|def"

你得到了什么输出? - Uri Mikhli
@UriMikhli 这是第一个代码块中的最后一行。 - Sean Mackesey
1
嗯,有Regex(join([x.pattern,y.pattern], "|")),但那不太好看,而且我不知道它在更复杂的情况下会表现如何。 - DSM
@DSM 不太好看,但比我想象中的要好,我不知道 pattern 属性! - Sean Mackesey
我认为你应该在github.com/julialang/julia上打开一个问题(issue)或者一个Pull请求。我认为这种行为是一个疏忽。 - ivarne
2个回答

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

r“quote”操作符实际上会为您编译一个正则表达式,这需要时间。如果您只想使用正则表达式的某些部分来构建更大的表达式,则应使用“普通引号”存储这些部分。

但是,关于r“quote”与“普通引号”之间模糊的转义规则呢?如果您想要r“quote”的模糊规则,但又不想立即编译正则表达式,则可以使用宏,例如:

macro p_str(s) s end

现在你有一个像r"引号"一样转义但只返回字符串的p"引号"。

不要跑题,但你可能定义了一些引号来绕过棘手的字母表。这里有一些方便的引号:

                                       # "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,0x280x1d,0x70,0x1d,0x61,0x1d,0x74,0x72,0x00,0x09,0x00]

谢谢Michael。看来我的问题的答案是否定的。你的回答包含了一些很酷的东西(我甚至不知道dump()),但我已经明白了,我可以通过操作字符串部分并调用Regex()来构造正则表达式。然而,我具体的场景是当有正则表达式而不是字符串时。我想在这种情况下你必须使用pattern - Sean Mackesey
似乎一旦使用join()来组合p-字符串,转义就会恢复到字符串中通常的状态。所以合并的模式实际上没有正确的转义。当然,我可能会漏掉某些东西,因为我是Julia的新手。 - Daniel Genin

1

与其加入正则表达式,我认为最好的方法是将字符串连接起来,然后将结果转换为正则表达式。这样,您可以按照以下方式解决问题:

x = "abc"
y = "def"
z = Regex(join([x,y], "|"))
println(z)

你应该得到r"abc|def"作为输出。
注意:在这里,我利用了Michel Fox的答案,删除了宏。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接