正则表达式将字符串中的值捕获到一个组中,而不考虑顺序?
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 正则表达式。我会调整标签。谢谢!以上是关于正则表达式将字符串中的值捕获到一个组中,而不考虑顺序?的主要内容,如果未能解决你的问题,请参考以下文章