我尝试用 C(POSIX、ERE)编写以下代码。
regcomp(®ex, pat, REG_EXTENDED)
输入表达式的格式为:token1 token2 token3。
:alnum:
或 * 空格。A
。我的正则表达式如下所示:
([[:alnum:] ]+) (A)? ?([[:digit:]]{4})
我想分别捕获group1,2,3中的token1,2,3。
示例:
我想要的:
R2D2 A 2250
-> 组1:R2D2
,组2:A
,组3:2250
R2D2 A 2250
-> 组1:R2D2 A
,组3:2250
由于 POSIX 不支持
(?...)
并且我必须使用 ERE (regex.h),文字 A
会自动归属于 group1。
如何阻止正则表达式考虑 group1 的可选
A
?我相信你可以组合两个正则表达式,一个带 token2,一个不带,然后组合结果组:
$ sed -nE '
s/(^([[:alnum:] ]+) (A) ([[:digit:]]{4})$)|(^([[:alnum:] ]*[^A]|[[:alnum:] ]*[^ ]A)() ([[:digit:]]{4})$)/(\2\6)(\3\7)(\4\8)/p
' <<EOD
R2D2 1234
R2D2 A 1234
R2D2 A A 1234
R2D2 AB 1234
R2D2 123
EOD
(R2D2)()(1234)
(R2D2)(A)(1234)
(R2D2 A)(A)(1234)
(R2D2 AB)()(1234)
$