Regex 正则表达式-捕获多个组并在一个字符串中多次组合它们

Regex 正则表达式-捕获多个组并在一个字符串中多次组合它们,regex,ruby,Regex,Ruby,我需要使用正则表达式组合一些文本,但在尝试捕获和替换字符串时遇到了一些麻烦。例如,我需要从一开始就捕获数字,并将它们以替换的形式添加到两个数字之间闭合的每个部分|| 我有: ||10||a||ab||abc|| 我想: ||10||a10||ab10||abc10|| 所以我需要捕获组1中的“10”和捕获组2中的“a | ab | abc” 我尝试过类似的方法,但对我来说不起作用(只捕获一个[a-z]组) 我可以在没有复杂正则表达式的情况下实现这一点。例如,您可以这样做: input = "

我需要使用正则表达式组合一些文本,但在尝试捕获和替换字符串时遇到了一些麻烦。例如,我需要从一开始就捕获数字,并将它们以替换的形式添加到两个数字之间闭合的每个部分||

我有:

||10||a||ab||abc||
我想:

||10||a10||ab10||abc10||
所以我需要捕获组1中的“10”和捕获组2中的“a | ab | abc”

我尝试过类似的方法,但对我来说不起作用(只捕获一个[a-z]组)


我可以在没有复杂正则表达式的情况下实现这一点。例如,您可以这样做:

input = "||10||a||ab||abc||"
parts = input.scan(/\w+/)   # => ["10", "a", "ab", "abc"]
parts[1..-1].each { |part| part << parts[0] }   # => ["a10", "ab10", "abc10"]

"||#{parts.join('||')}||"
input=“| | 10 | | a | | ab | | abc |”
零件=输入。扫描(/\w+/)#=>[“10”、“a”、“ab”、“abc”]
部分[1..-1]。每个{部分{部分[“a10”、“ab10”、“abc10”]
“| |#{零件.连接('| |')}| |”

我可以在不使用复杂正则表达式的情况下实现这一点。例如,您可以这样做:

input = "||10||a||ab||abc||"
parts = input.scan(/\w+/)   # => ["10", "a", "ab", "abc"]
parts[1..-1].each { |part| part << parts[0] }   # => ["a10", "ab10", "abc10"]

"||#{parts.join('||')}||"
input=“| | 10 | | a | | ab | | abc |”
零件=输入。扫描(/\w+/)#=>[“10”、“a”、“ab”、“abc”]
部分[1..-1]。每个{部分{部分[“a10”、“ab10”、“abc10”]
“| |#{零件.连接('| |')}| |”

first=nil
str.gsub(/(?“| | 10 | | a10 | | ab10 | | abc10 |”
正则表达式的内容是,“匹配紧跟在两个管道之后的管道中的一个或多个字符”(
(?)?

first=nil
str.gsub(/(?“| | 10 | | a10 | | ab10 | | abc10 |”

正则表达式的内容是,“匹配紧跟在两个管道之后的管道中的一个或多个字符”(
(?如果没有一个无限宽的lookbehind或一些额外的代码,你就无法正确地完成它。它在C#中使用吗?每行管道之间是否总是有4个值?@TimBiegeleisen-不,可能有更多或更少的值。你在使用什么语言/工具?我不知道/使用Ruby,但我建议只提取第一个值,然后拆分你的st打开
| |
,最后将其拼合在一起。如果没有一个无限宽的查找或一些额外的代码,你就无法正确地完成它。它在C#中使用吗?每行管道之间是否总是有恰好4个值?@TimBiegeleisen-不,可能有或多或少的值。你在使用什么语言/工具?我不知道/使用Ruby,但我会建议gest只需提取第一个值,然后在
| |
上拆分字符串,最后将其拼合在一起。
str = "||10||a||ab||abc||"
first = nil
str.gsub(/(?<=\|\|)[^\|]+/) { |s| first.nil? ? (first = s) : s + first }
  #=> "||10||a10||ab10||abc10||"