我使用ruby的正则表达式来处理诸如

${1:aaa|bbbb}
${233:aaa | bbbb | ccc  ccccc }
${34: aaa | bbbb | cccccccc     |d}
${343:   aaa   |   bbbb   |       cccccccc     |dddddd   ddddddddd}
${3443:a aa|bbbb|cccccccc|d}
${353:aa a| b b b b | c c c c c c c c      |        dddddd}

我想在每条管道之间得到修剪过的文本例如,对于上例的第一行,我想要得到aaa和bbbb的结果,对于第二行,我想要aaa、bbbb和ccc ccc。现在我已经编写了一段正则表达式和一段ruby代码来测试它:
array = "${33:aaa|bbbb|cccccccc}".scan(/\$\{\s*(\d+)\s*:(\s*[^\|]+\s*)(?:\|(\s*[^\|]+\s*))+\}/)
puts array

现在我的问题是(?:\|(\s*[^\|]+\s*))+部分不能创建多个组我不知道如何解决这个问题,因为我需要在每行的文本数量是可变的有人能帮忙吗?

最佳答案

在正则表达式中重复捕获组时,捕获组只存储与上次迭代匹配的文本。如果需要捕获多个迭代,则需要使用多个正则表达式(.NET是唯一的例外它的CaptureCollection提供捕获组的所有迭代的匹配。)
在您的示例中,可以执行搜索并替换以将^\d+:替换为空去掉字符串开头的数字和冒号然后调用split()使用regex\s*\|\s*将字符串拆分为由竖线分隔的元素。

10-06 14:21