如何使用正则表达式解析字符串以仅获取一定数量的匹配项?

如何使用正则表达式解析字符串以仅获取一定数量的匹配项?

我目前正在使用以下正则表达式将我的字符串分成组。

^([a-zA-Z0-9]*)(\[([a-zA-Z0-9=]*)\]){0,1}@([a-zA-Z0-9]*)$

Pty[R=4]@ID

我有四组

1) Pty
2) [R=4]
3) R=4
4) ID

但是,我只需要三组

1) Pty
2) R=4
3) ID

这个正则表达式应该也能够接受 Pty@ID 来获取两个组

1) Pty
2) ID

我怎样才能实现这个目标?

答案1

您没有指定任何工具,因此我使用perl以下示例:

$ echo Pty[R=4]@ID | perl -nle '
    print "$1\n$2\n$3\n$4"
        if /^([a-zA-Z0-9]*)(\[([a-zA-Z0-9=]*)\]){0,1}@([a-zA-Z0-9]*)$/
'
Pty
[R=4]
R=4
ID

$ echo Pty@ID | perl -nle '
    print "$1\n$2\n$3\n$4"
        if /^([a-zA-Z0-9]*)(\[([a-zA-Z0-9=]*)\]){0,1}@([a-zA-Z0-9]*)$/
'
Pty


ID

通过正则表达式捕获组,您可以使用反向引用获取之前的比赛。在 中perl,您可以使用$1, $2,..., $n

在你的情况下,你可以使用非捕获组为了防止[R=4]被捕获:

$ echo Pty[R=4]@ID |
perl -nle '
    print "$1\n$2\n$3"
        if /^([a-zA-Z0-9]*)(?:\[([a-zA-Z0-9=]*)\]){0,1}@([a-zA-Z0-9]*)$/
'
Pty
R=4
ID

正如您php在评论中提到的,您可以使用PHP反向引用语法\1\g1\g{1}

相关内容