1. ホーム
  2. regex

[解決済み】Regexのオプショングループ

2022-01-28 20:05:37

質問

私はこの正規表現を使用しています。

((?:[a-z][a-z]+))_(\d+)_((?:[a-z][a-z]+)\d+)_(\d{13})

のような文字列にマッチします。

SH_6208069141055_BC000388_20110412101855

4つのグループに分かれる。

SH
6208069141055
BC000388
20110412101855

質問です。 最初のグループをオプションにし、結果のグループを空文字列にするには?
可能な限り、すべてのケースで4つのグループを取得したいのですが。

この場合の入力文字列。(最初のグループの後にアンダーラインはありません)

6208069141055_BC000388_20110412101855

解決方法は?

正規表現を簡略化すると、次のようになります。

(?:([a-z]{2,})_)?(\d+)_([a-z]{2,}\d+)_(\d+)$
^              ^^
|--------------||
| first group  ||- quantifier for 0 or 1 time (essentially making it optional) 

最初のグループを除いた入力文字列にアンダースコアがつくかどうかはわかりませんが、文字列全体であれば上記の正規表現でOKです。

regex101 デモ

ご覧のように、2番目のマッチのマッチドグループ1は空で、マッチドグループ2から始まっています。