1

私はこのようなことを試みています

^(.*)[\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 にすることはできません。

なにか提案を?

4

3 に答える 3

1

特に問題を解決するための単純なアルゴリズムを提供するため、ここでは正規表現は答えではないと思います。アルゴリズムをコードに変換するだけです。

また、コメントで述べているように [] のバランスが取れておらず、ネストされているため、正規表現は解決策ではありません。正規表現は実用的ではありません。

次のような JavaScript を試してください。

function parse ( text ) {
    var first, inside;
    if ( text.substr (-1) == ']' ) {
        var pos = text.lastIndexOf ('[');
        first = text.substr (0, pos);
        inside = text.substr ( pos + 1, text.length -pos - 1);
    } else {
        first = text;
     }
     return [ first, inside ];
}
于 2013-09-10T16:33:12.723 に答える