我目前正在使用以下正则表达式将我的字符串分成组。
^([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}
。