1

我正在尝试这样的事情

^(.*)[\s]*(?:\[[\s]*(.*)[\s]*\])?$

我的想法是第一个匹配返回所有内容,但偶尔的第二个匹配是 [] 内的任何内容。要匹配的传入字符串已被修剪。

例如

'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    

我的主要问题是由于第一场比赛,因为 .* (全部吞下)和 *? (仅吞咽直到第一个 ] 如果有多个)给出不希望的结果

算法的伪代码类似于:

  • 如果最后一个字符是 ']',则第二个匹配项将是向后最接近的 '[' 内的任何内容(如果存在)-> 如果输入字符串以 '[]' 结尾,则这可以是 null 或 ''
  • rest 是第一个匹配,不能为 NULL,只有 ''

有什么建议吗?

4

3 回答 3

2

如果没有嵌套,您可以使用此正则表达式:

^(.*?)\s*(?:\[([^\]]*)\])?$

正则表达式101演示

否则,如果您可以嵌套[]在 main[]中,则必须修改正则表达式。您可以为嵌套创建正则表达式,[]但只能达到一定的嵌套级别;如果您有多达 2 层的嵌套,则为 2 制作一个正则表达式,如果您有多达 5 层的嵌套,则为 5 制作一个更复杂的,依此类推。

于 2013-09-10T10:44:35.193 回答
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 回答
1

我不确定你想做什么,但是,这里是一个尝试:/(.*?)\[(.*?)\]$/

另一个尝试,允许第二组保持 undefined : /(.*?)(?:\[(.*?)\])?$/

我从未使用过 Scriptular,但 Chrome 的控制台是这样说的:

// result : [full match, group 1, group 2]
'abc'.match(/(.*?)(?:\[(.*?)\])?$/) // ["abc", "abc", undefined]
'[abc]'.match(/(.*?)(?:\[(.*?)\])?$/) // ["[abc]", "", "abc"]

这个呢:/(.*?)(?:\[([^\[]*?)\])?$/

'aze[[[rty]'.match(/(.*?)(?:\[([^\[]*?)\])?$/) // ["aze[[[rty]", "aze[[", "rty"]

最后一次尝试:/(.+?)(?:\[([^\[]*?)\])?$/

test         result
-------------------------------------------
''           null
'aze'        ["aze", "aze", undefined]
'[rty]'      ["[rty]", "[rty]", undefined]
'aze[rty]'   ["aze[rty]", "aze", "rty"]
'aze[]'      ["aze[]", "aze", ""]
'aze[][rty]' ["aze[][rty]", "aze[]", "rty"]
'aze[[]rty]' ["aze[[]rty]", "aze[", "]rty"]
于 2013-09-10T11:14:05.033 回答