特定の数の一致のみを取得するために正規表現を使用して文字列を解析する方法は? [閉鎖]

特定の数の一致のみを取得するために正規表現を使用して文字列を解析する方法は? [閉鎖]

現在、次の正規表現を使用して文字列をグループに分割しています。

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

Pty[R=4]@ID

4つのグループがあります。

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

しかし、3つのグループだけが必要です。

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}

関連情報