什么是区间正则表达式和标记正则表达式?

什么是区间正则表达式和标记正则表达式?

我最近在阅读 sed 时遇到了这个话题。我需要一些例子来更好地理解这个主题。

答案1

正则表达式中的区间运算符基本正则表达式标准支持的 (BRE)sed指的是\{x,y\}.

等效的 ERE(扩展)或 PCRE(perl兼容)运算符(在某些实现中使用-r/-E, -R/ )将是。-Psed{x,y}

它们用于指定正则表达式的重复计数范围。

sed 's/<a\{3,12\}>/<b>/'

将替换第一次出现的 ,<然后是 3 到 12a秒,然后><b>

在类似的输入上<a> <aa> <aaaa> <aaaaaaaa>,它将替换<aaaa><b>

标记正则表达式更常被称为捕获组

在 BRE 中,这与\(...\)ERE/PCRE 和(...).他们习惯了捕获与正则表达式匹配的文本,可以将其用作反向引用或在替换中。这些也可用于分组(如\(foo\)*任意数量的foos)。

在:

sed 's/\(.\)\(.\)\(.*\)\2\1/\1\2<\3>\2\1/'

我们有 3标记表达式又名捕获组,第一个匹配的字符(.用于匹配单个字符)\(.\)将被标记为,并在正则表达式中稍后1引用(因此,如果第一个捕获,将仅匹配 on ),并且也会在替代品。\1\(.\)x\1x

在类似 的输入上whatever -+foobar+-,正则表达式将找到:(1:-)(2:+)(3:foobar)(2:+)(1:-)并且该s命令会将其替换为-+<foobar>+-

标准 (POSIX) ERE 不支持反向引用(\1在上面的正则表达式中),因此(...)仅适用于分组(如 in(foo|bar)(foo){1,3}),尽管某些实现支持将其作为扩展。 POSIX 规范的下一个主要版本将指定正则表达式使用 ERE 的-E选项。在正则表达式(反向引用)中仍然不受支持,但在替换中将扩展为与相应标记表达式匹配的内容。sed\1\1s

python, perl, PCRE 或兼容的正则表达式还允许您为标记表达式指定任意名称(而不仅仅是1, 2... 从左到右编号)。详细信息请参阅他们的手册。

相关内容