【问题标题】:Joining regular expressions in julia在 Julia 中加入正则表达式
【发布时间】:2015-12-12 11:35:54
【问题描述】:
x = r"abc"
y = r"def"
z = join([x,y], "|")

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

有没有办法join(并且通常操纵)Regex 仅处理正则表达式内容(即不将 r 修饰符视为内容的一部分)。 z 的期望输出是:

z # => r"abc|def"

【问题讨论】:

  • 你得到的输出是什么?
  • @UriMikhli 第一个代码块的最后一行。
  • 嗯,有Regex(join([x.pattern,y.pattern], "|")),但这不是很漂亮,我不知道它在更复杂的情况下会如何表现。
  • @DSM 不漂亮但比我有的更好,我不知道pattern 属性!
  • 我认为您应该将其作为问题打开,或者在 github.com/julialang/julia 上提出拉取请求。我认为这种行为是疏忽。

标签: regex julia


【解决方案1】:
macro p_str(s) s end
x = p"abc"
y = p"def"
z = Regex(join([x,y], "|"))

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

但是你问的 r"quote" 与 "regular quotes" 的粗略转义规则呢?如果您想要粗略的 r"quote" 规则但不立即编译正则表达式,那么您可以使用如下宏:

macro p_str(s) s end

现在你有一个 p"quote",它像 r"quote" 一样转义,但只返回一个字符串。

不要偏离主题,但您可以定义一堆引号来绕过棘手的字母表。这里有一些方便的:

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

【讨论】:

  • 谢谢迈克尔。看来我的问题的答案是否定的。你的答案包含一些很酷的东西(我什至不知道dump()),但我已经明白我可以通过操作字符串部分然后调用Regex() 来构造正则表达式。不过,我的具体情况是当一个人有正则表达式而不是字符串时。我想在那种情况下你必须使用pattern。
  • 似乎一旦你使用 join() 来组合 p 字符串,转义就会恢复到它通常在字符串中的样子。所以组合模式毕竟没有正确的转义。当然,我可能会遗漏一些东西,因为我是 Julia 的新手。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-14
相关资源
最近更新 更多