Ruby 如何捕捉角色并在下一场比赛中“重复”它?

Ruby 如何捕捉角色并在下一场比赛中“重复”它?,ruby,regex,Ruby,Regex,我有这个文本,我需要提取所有由|,:|。。。等 现在我有以下正则表达式: /([\|\[].+?[\|\]])/m 它每隔一个指南针工作一次,因为[\\]]这个标记消耗了这个字符 我想用这种方式捕捉罗盘: |def gfe| |dff cee| |dfe dBA| |dff cee| |def gfe| |faf gfe| |1 dfe dBA:| |2 dfe dcB|] 用于返回所有匹配项的数组 例如: 上述申报表: [["|def gfe|"], ["|dfe dBA|"], ["|d

我有这个文本,我需要提取所有由|,:|。。。等

现在我有以下正则表达式:

/([\|\[].+?[\|\]])/m
它每隔一个指南针工作一次,因为[\\]]这个标记消耗了这个字符

我想用这种方式捕捉罗盘:

|def gfe|
|dff cee|
|dfe dBA|
|dff cee|
|def gfe|
|faf gfe|
|1 dfe dBA:|
|2 dfe dcB|]
用于返回所有匹配项的数组

例如:

上述申报表:

[["|def gfe|"], ["|dfe dBA|"], ["|def gfe|"], ["|1 dfe dBA:|"], ["|]\n~A3 B3|"], ]...], [...]]

希望这能有所帮助这里有几种方法可以帮你做到这一点

1在每条管线上使用,然后固定管线末端

2对每行应用正则表达式以创建数组,然后修改数组的每个元素


?我从提供的注释和示例中注意到,您不想在一行的开头捕获圆规,可能是因为is在左侧没有|,而且结果总是只有|在左侧,[|,| |,|:,:|,…,等等在右侧。 尝试以下模式:

(?<=[\]:|])([^|\r\n]+\|[:\]]?)

希望对您有所帮助

下面是Ruby中类似操作的描述|字符在本例中仅用作视觉和语法分隔符,您真的不需要捕获它,是吗?您可以捕获集合{'def gfe'、'dff cee'、'dfe dBA'、…、'1 dfe dBA:'、'2 dfe dcB'}假设是条形字符。调得好,BTW问题是|分隔符可以与其他字符捆绑在一起,例如:[|,| |,|:,:|,…,等等,所以我确实需要捕获它们。@ViktorJusto类似这样的东西?我不清楚您的预期结果。@hwnd是的,这与我要查找的非常接近。给我一点时间,我正在研究您的regexp。在第一行中,这确实返回了| dff cee |或| 2 dfe dcB |.我没有检查其他两行。-1,不是因为答案是错的,而是因为你知道答案是错的就让它存在。
[["|def gfe|"], ["|dfe dBA|"], ["|def gfe|"], ["|1 dfe dBA:|"], ["|]\n~A3 B3|"], ]...], [...]]
def split_em(str)
  arr = str.split(?|).map { |s| "|#{s}|" }
  arr[-1] << (arr.pop).tr(?|,'') unless str[-1] == ?|
  arr
end

split_em("dff cee|def gfe|dff cee|dfe dBA|dff cee|def gfe|faf gfe|1 dfe dBA:|2 dfe dcB|]")
  #=> ["|dff cee|", "|def gfe|", "|dff cee|", "|dfe dBA|", "|dff cee|",
  #    "|def gfe|", "|faf gfe|", "|1 dfe dBA:|", "|2 dfe dcB|]"]
split_em("~A3 B3|gfe fdB|AFA B2c|dfe dcB|~A3 ~B3|efe efg|faf gfe|1 dfe dcB:|2 dfe dBA|]")
  #=> ["|~A3 B3|", "|gfe fdB|", "|AFA B2c|", "|dfe dcB|", "|~A3 ~B3|",
  #    "|efe efg|", "|faf gfe|", "|1 dfe dcB:|", "|2 dfe dBA|]"]
split_em("fAA eAA|def gfe|fAA eAA|dfe dBA|fAA eAA|def gfe|faf gfe|dfe dBA:|")
  #=> ["|fAA eAA|", "|def gfe|", "|fAA eAA|", "|dfe dBA|",
  #    "|fAA eAA|", "|def gfe|", "|faf gfe|", "|dfe dBA:|"]
def split_em(str)
  str.scan(/(?<=^|\|).+?\|(?:[^|]*?$)?/).map { |s| "|#{s}" }
end
(?<=[\]:|])([^|\r\n]+\|[:\]]?)
(?<=[\]:|])     # a look-behind for any of "]:|"
(               # capture gourp 1
    [^|\r\n]+   # anything that is not one of "|\r\n"
    \|          # followed by "|"
    [:\]]?      # followed by and optional one of ":]"
)               # end of capture group 1