gpt4 book ai didi

regex - 如何从一行中提取多个非贪婪正则表达式匹配部分?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:56:59 28 4
gpt4 key购买 nike

如果我有这样一个文件:

abc defghaijkb,mnaobpqa
pbqaaa
qrs - a .. b ...
cde

如何提取以a开头的所有部分并以 b 结尾(我选择这些字符是为了简化示例,它们可能会被一些更复杂的正则表达式代替)?这是一个期望的输出:

ab
aijkb
aob
a .. b

(将每个项目放在单独的行中)。由于 (g)awk 中没有非贪婪匹配 ( .*? ),我找不到解决这个问题的方法(例如,使用 split )。

注意 1:无需使用多行匹配 - 即 regex1 之间不允许换行和 regex2 .

注2:我不想用sed ,我想知道这是否可以使用 awk、bash 或其他一些逐行处理输入文件的命令行工具来完成...AWK 似乎是一个不错的解决方案,但是...如果只是它支持非贪婪 .*?

注意 3:我不能使用 grep因为我总是得到 memory exhausted处理大文件时出错。

注意 4. 这是一个更复杂的例子 regex1regex2 .如果它们可以包含非贪婪 .*? 怎么办? ?例如。 <a>.*?<b>.*?</b>.*?</a> .

更新。更复杂的例子:

[a]text1[a]text000[b]text2[/b]text11[/a]c defgh[a]text3[b]text33[/b]text333[/a]...[/a],mnaobpqa
...[b]aa[/b]bb[/a],,,
qa - [a][b][/b][/a] aabbcc ...
cde

期望的输出:

[a]text000[b]text2[/b]text11[/a]
[a]text3[b]text33[/b]text333[/a]
[a][b][/b][/a]

最佳答案

纯 AWK 黑客:

awk 'BEGIN{RS="a"}/b/&&NR!=1{sub(/b.*/,"");if($0!~"\n")print"a"$0"b"}'
  • a 拆分文件并忽略第一段(pre-a)。
  • 如果段中没有b,忽略它。
  • 首先切断所有 b 和进一步。
  • 如果段中有换行,忽略它。
  • 重构截止"a""b"并打印。

我认为您永远不应该使用它。使用 perl - 它存在于几乎所有存在 awk 的系统上,并使这项任务变得轻而易举:

perl -ne 'print map { "$_\n" } /a.*?b/g;'

这甚至适用于 grep 不支持 PCRE 的系统,因为 Perl 根据定义支持 PCRE。 (我不知道内存耗尽错误 - 正如 rici 所说,它不应该发生在非病理性正则表达式中。)

EDIT 以回应 OP 提出的其他问题:

“有能力的工具”是任何支持非贪婪运算符和每行多个匹配的东西 - 在这种情况下,perl 是普遍性、表达能力和速度之间的最佳折衷。

所写的行是一个过滤器 - 你在标准输入中提供输入,你在标准输出中得到输出 - 就像你使用 awksed 一样。

标准正则表达式语法适用:方括号和斜杠需要转义。

perl -ne 'print map { "$_\n" } /\[a\].*?\[b\].*?\[\/b\].*?\[\/a\]/g;' <infile >outfile

关于regex - 如何从一行中提取多个非贪婪正则表达式匹配部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34408268/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com