如何在 grep 中使用正则表达式(仅限基本正则表达式)实现交替?

如何在 grep 中使用正则表达式(仅限基本正则表达式)实现交替?

我知道这个问题没有多大意义,因为我可以只使用扩展正则表达式(ERE)。但我们暂时来说,实施交替是目前唯一的选择。我如何仅使用 BRE 来实现它?或者我必须找到解决方法?

假设我们有这个字符串:

AAAAAA======-----======AAAAAAAAA

我现在的目标是仅使用基本正则表达式分别匹配 AAAAA、======、-----、====== 和 AAAAAAAAA。使用 ERE 这可以很快完成,但我想知道如何仅通过 BRE 来实现它。到目前为止,我无法找到一种正确的方法来做到这一点,而不需要一些字符串相互重叠匹配(例如正则表达式匹配“AAAAA==”,这不应该发生)。

答案1

简单:就是这样不是BRE 可能有交替

POSIX BRE 不支持任何其他功能。甚至不支持交替。

您的基本目标:

我现在的目标是……分别……与基本正则表达式进行匹配。

可以使用 BRE:

$ str='AAAAAA======-----======AAAAAAAAA'
$ echo "$str" | grep -Eo '(.)\1*'
AAAAAA
======
-----
======
AAAAAAAAA

或者甚至在 BRE grep 中使用多种模式:

$ echo "$str" | grep -o -e 'AA*' -e '--*' -e '==*'
AAAAAA
======
-----
======
AAAAAAAAA

或者将您的解决方案限制为 GNU grep(\|即使在 BRE 语法中也允许交替;这不是有效的 POSIX 功能):

$ echo "$str" | grep -o '\(AA*\)\|\(==*\)\|\(--*\)'

但你的次要目标:

是否也可以将它们另外放入单独的捕获组中?

只要求正则表达式,并且由于 BRE 中不可能进行交替,所以这是不可能的。

关于 BRE 中交替的一个很好的解释

答案2

匹配重复字符的字符串基本正则表达式:

$ echo 'AAAAAA======-----======AAAAAAAAA' | grep -o '\(.\)\1*'
AAAAAA
======
-----
======
AAAAAAAAA

.匹配任何字符。 \(.\)匹配任何字符并将该字符存储在捕获组 1 中。 \1*匹配该同一字符的任何其他出现。

\1BRE 中支持 反向引用(例如 )的使用POSIX

相关内容