私はこのようなことを試みています
^(.*)[\s]*(?:\[[\s]*(.*)[\s]*\])?$
私の考えでは、最初の一致はすべてを返しますが、[] 内のものである時折の 2 番目の一致を返します。一致する受信文字列は既にトリミングされています。
例えば
'aaaaa [] [ddd]' -> returns 'aaaa []' plus 'ddd'
'[] [ddd]' -> returns '[]' plus 'ddd'
'aaaaaaaa' -> returns 'aaaaaaa' plus NULL
'aaaaaaaa []' -> returns 'aaaaaaa' plus ''
'aaaaaa [' -> returns 'aaaaaa [' plus NULL
'aaaa [] ddd' -> returns 'aaaa [] ddd' plus NULL
'[a] [b] [c] [d]' returns '[a] [b] [c]' plus 'd' instead of '' plus 'a] [b] [c] [d'
'[fff]' -> return '' plus 'fff' <- That's particular since first match can never be null
.* (すべてを飲み込む) と *? の両方なので、私の主な問題は最初の一致によるものです。(複数の場合は最初の ] までのみ飲み込む) 望ましくない結果をもたらす
アルゴリズムの擬似コードは次のようになります。
- 最後の文字が ']' の場合、2 番目の一致は内部から最も近い '[' 後方 (存在する場合) までのすべてになります -> 入力文字列が '[]' で終わる場合、これは null または '' になります。
- 残りは最初の一致で、NULL にすることはできません。
なにか提案を?