正则表达式将字符串中的值捕获到一个组中,而不考虑顺序?

Posted

技术标签:

【中文标题】正则表达式将字符串中的值捕获到一个组中,而不考虑顺序?【英文标题】:RegEx to capture values in a string into a group, regardless of order? 【发布时间】:2011-07-14 03:07:33 【问题描述】:

我在一个文本文件中有一堆字符串,其中包含我想要捕获到组中的值。文本文件中的每一行/每一行都是一个唯一的记录,但值通常在每一行中遵循规定的格式:

ValueA ValueD ValueS ValueR ValueW ValueT
ValueX ValueW ValueB ValueM ValueQ ValueA

等等。如果我想将 ValueA 捕获到捕获组 1 并将 ValueW 捕获到捕获组 2,我可以使用单个正则表达式来正确处理事情,而不管相关值在每行文本中的位置如何?

目标是然后使用捕获组将两个捕获的值写回文件,以便我可以对它们进行排序,即“ValueW ValueA”。

【问题讨论】:

【参考方案1】:

你可以使用类似的东西:

^(?=.*?(ValueA))(?=.*?(ValueW)).*

Perl 示例:

$_ = <<'_STR_';
ValueA ValueD ValueS ValueR ValueW ValueT
ValueX ValueW ValueB ValueM ValueQ ValueA
_STR_

s/^(?=.*?(ValueA))(?=.*?(ValueW)).*/$1 $2/gm;

print;

输出:

ValueA ValueW
ValueA ValueW

也可以在http://ideone.com/IhGfS

注意:如果您只是匹配,则不需要最后一个 .*,并且根据 ValueX 模式的匹配程度,您可以删除所有 ?

【讨论】:

去掉前面的插入符号,这样就完美了!谢谢! ^ 应该使用,如果在一个字符串上操作,请确保使用多行模式/m 正确,尽管它似乎可以正常工作。对引用的字符串感到困惑,我认为是贪婪匹配而不是惰性匹配,但第二次正则表达式运行很容易解决。 是否需要以不同的方式编写才能在 sed 中工作?我尝试了几种变体,sed 只是吐出原始文本,未经修改。所有手册页都说 sed 完全实现了 PCRE,但它似乎根本不支持命名捕获组。请注意,我正在使用与 Windows 的“git”打包的 sed 版本,我认为它与 mingw(不是 cygwin)相关联。他们可能会做一些不同的事情。 我不知道 sed,但是如果你有 Perl,你可以做类似perl -pe "s/^(?=.*?(ValueA))(?=.*?(ValueW)).*/$1 $2/gm" file.txt【参考方案2】:

可能是这样的:

(?<ValueA>ValueA)|(?<ValueW>ValueW)

【讨论】:

我试过这个。 OR 语句仅捕获其中一个。两者都存在于每一行中,但它们的顺序不同。我愿意用两个单独的正则表达式配方来尝试这个(如果需要,我可以编写一个 bash 脚本),但我想看看它是否可以只用一个来完成,可能是通过 egrep 或 sed。【参考方案3】:

假设它的unix,首先用换行符查找和替换空格,用各种正则表达式管道它,然后将组输出到文件。

【讨论】:

【参考方案4】:

这是正则表达式滥用 - 报警!

说真的...如果您必须这样做,您可以在每个组中使用或运算符 (|) 来选择两个单词中的一个或另一个。

【讨论】:

顺便说一句 - 这在很大程度上取决于哪个正则表达式。始终使用您的意思标记正则表达式帖子。 抱歉,这是 PCRE 正则表达式。我会调整标签。谢谢!

以上是关于正则表达式将字符串中的值捕获到一个组中,而不考虑顺序?的主要内容,如果未能解决你的问题,请参考以下文章

Perl 中的正则表达式组:如何从正则表达式组中捕获与字符串中出现的未知数量/多个/变量匹配的元素到数组中?

如何使用正则表达式验证捕获组中的最后一个字符

具有不同量词的正则表达式捕获组

如何从正则表达式捕获组中修剪空白?

用于捕获嵌套括号中的值的正则表达式

正则表达式中的命名捕获组