我知道这个问题没有多大意义,因为我可以只使用扩展正则表达式(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 中不可能进行交替,所以这是不可能的。
答案2
匹配重复字符的字符串基本正则表达式:
$ echo 'AAAAAA======-----======AAAAAAAAA' | grep -o '\(.\)\1*'
AAAAAA
======
-----
======
AAAAAAAAA
.
匹配任何字符。 \(.\)
匹配任何字符并将该字符存储在捕获组 1 中。 \1*
匹配该同一字符的任何其他出现。
\1
BRE 中支持 反向引用(例如 )的使用POSIX。