0

所以我想以任意顺序在字符串中搜索 A、B、C、D,但如果 C 不存在,我仍然希望它给我 A、B 和 D 等。

更具体地说,这是我要解决的确切问题。CSV 文件的行如下所示:

Name,(W)5555555,(H)5555555,(M)5555555,(P)5555555

然而,W,H,M,P 可以是任何顺序。另外,它们并非都存在于每一行。所以它看起来更像这样:

Name,(W)5555555,(H)5555555,(M)5555555,(P)5555555
Name,(H)5555555,(P)5555555,(W)5555555,(M)5555555
Name,(M)5555555,(H)5555555,,
Name,(P)5555555,,,

我需要完成的是将所有项目按正确的顺序排列,以便它们在正确的列下排列。所以当我完成时,上面应该是这样的:

Name,(W)5555555,(H)5555555,(M)5555555,(P)5555555
Name,(W)5555555,(H)5555555,(M)5555555,(P)5555555
Name,,(H)5555555,(M)5555555,
Name,,,,(P)5555555

编辑:看来我是一个糟糕的 Stack Overflow 公民。当我的项目需要完成时,我没有足够快地得到答案,因此忘记回来在我的帖子中添加正确的问题。我最终编写了一个 python 脚本来执行此操作,而不是像我最初尝试做的那样仅在 BBEdit 或 Sublime Text 2 中使用查找/替换。

所以我想要一种方法来做这样的事情,它可以在 BBEdit 或 Sublime Text 中工作。或者 Vim 。这次我会尽量密切关注它,我会回应已经存在的答案。

4

2 回答 2

1

如果您的正则表达式支持lookarounds,这可以通过简单的正则表达式替换来完成。由于前瞻不会提前正则表达式引擎光标的位置,因此我们可以使用它们在某个特定位置之后的某处查找多个模式。我们可以捕获所有这些发现并将它们写回替换字符串中。为了确保所有这些都是可选的,我们可以简单地使用?,但在这种情况下,我将添加一个空的替代前瞻 - 这是在引擎回溯时欺骗引擎所必需的。该模式可能如下所示:

^Name,(?=.*([(]W[)]\d+)|)(?=.*([(]H[)]\d+)|)(?=.*([(]M[)]\d+)|)(?=.*([(]P[)]\d+)|).*

最后.*是确保在替换中删除所有内容。

而替换字符串是这样的:

Name,$1,$2,$3,$4

这是一个使用 ECMAScript 风格的工作演示。这是一种相当有限的风格,因此该解决方案应该适用于大多数环境。

于 2013-08-21T18:26:03.553 回答
0

像这样的东西?

^Name,(\((?:W|H|P|M)\)\d+(?:,)?)*[,]*$

正则表达式可视化

在 Debuggex 上实时编辑

将为您提供每行的所有匹配项。然后,您只需将每个匹配项分配到右列。

于 2013-08-21T18:12:26.433 回答