如果存在下一个可选组,则使正则表达式停止匹配

问题描述 投票:0回答:1

我尝试用 C(POSIX、ERE)编写以下代码。

regcomp(&regex, pat, REG_EXTENDED)

输入表达式的格式为:token1 token2 token3。

  • token1,必填,是
    :alnum:
    或 * 空格。
  • token2,可选,如果存在,它仅包含文字
    A
  • token3,强制,始终为 4 个数字。

我的正则表达式如下所示:

([[: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

I.a.w.,如果存在可选组,如何在该组之前停止正则表达式匹配?

regex posix
1个回答
0
投票

我相信你可以组合两个正则表达式,一个带 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)
$
© www.soinside.com 2019 - 2024. All rights reserved.