如何匹配javascript正则表达式中的平衡分隔符?

时间:2013-12-22 06:13:25

标签: javascript regex recursion

我原以为这个问题是不可能的;据我所知,Javascript的正则表达式风格没有递归插值,也没有漂亮的.NET平衡组功能。然而,就像regex.alf.nu上的问题12一样:匹配<>的平衡对。除非在集合中有其他一些模式我没有得到。

所以...这可能吗?如果是这样,怎么样?

注意:

  1. 我知道这对于真正的正则表达式来说是不可能的,但基于挑战似乎它必须有可能在Javascript的风格(至少是不规则的,足以有反向引用)。我只是不知道任何可以让他们这样做的功能。

  2. 没有其他代码 - 表单允许输入单个正则表达式,该表达式根据页面上的测试字符串进行评估。我想,我可以尝试破解页面以打破正则表达式并进入原始JS,但这似乎并不符合这一挑战的精神。

  3. 大卫问,这是测试字符串。较长的一个被截断了字符数,但问题的标题是“平衡”,而完整的问题肯定支持“匹配”列具有平衡的<>对的假设。 “不”栏没有。

    Match all of these…
    
    <<<<<>><<>>><<... [62 chars]
    <<<<<>><>><<><... [110 chars]
    <<<<<>><>><>><... [102 chars]
    <<<<<>><>>>><<... [88 chars]
    <<<<<>>><<<>><... [58 chars]
    <<<<<>>><<><>>... [152 chars]
    <<<<<>>><<>><<... [42 chars]
    <<<<<>>><>><<<>>>><<>>
    <<<<<>>>><<<<>... [102 chars]
    <<<<<>>>><<<><... [30 chars]
    <<<<<>>>><><<<... [66 chars]
    <<<<<>>>><><<<... [124 chars]
    <<<<<>>>><>><<>>
    <<<<><<>>><<<>... [34 chars]
    <<<<>><<<>>>><... [92 chars]
    <<<<>>><<<<>><>><<<>>>>>
    <<<<>>><<<><<>>><><<>>>><<>>
    <<<<>>><<><<<>... [84 chars]
    <<<<>>>><<<><<... [52 chars]
    <<<><<<>>>><<<... [50 chars]
    <<<><<><>>>>
    <<<><>><<<>>>>
    <<<>><<<><<>>>... [44 chars]
    <<<>><><<<><>>... [48 chars]
    <<<>>><<><<<<>>>><<><<<>>>>>
    <<><<<<>><>>>>... [60 chars]
    <<>>
    <<>><<<<<>>>>>... [54 chars]
    <<>><<<<>><<<>... [74 chars]
    <>
    <><>
    
    and none of these…
    
    <
    <<<<<<>>><<><>>>>>><<>
    <<<<<>>><>>><<<>>>><>>
    <<<<<>>>>>>
    <<<<>><<<<<><<>><><<<<
    <<<>><<<<><><><><
    <<<>>>><><<<><>
    <<><<<<><<><<>>><<
    <<><<<>>>>><<
    <<>>><<<>>
    <><<<>><<>>><<>
    <><<>>><<<><>><<<>>><<>>>><
    <><<>>><><<<>
    <><>><>>><><<<... [36 chars]
    <>><><<<><>
    <>>>>>><<<>><<>><><
    <>>>>>>><<<
    >
    ><
    ><<<>><><<<><<
    ><<<>>>><><<<<><>>><<><><<
    ><<><<<<><<<<>>>><
    ><><><<<>>>>>
    ><><>>><>><>
    ><><>>>><>>>>>>><>>><>>
    ><>><<<<<>>
    ><>><><><<>><<>>><<
    ><>>><>>>>><<><<<><>><>><<<
    >><<<><<<<<<><>><<
    >><>>><<<><>>><><<>><<><><<
    >>>><>><>>>><>>><>><><
    >>>>><<<>>>
    

1 个答案:

答案 0 :(得分:6)

我不相信这在JavaScript中是可行的,尽管很难证明。例如,Java和PHP没有您提到的功能(递归插值,平衡组),但this fascinating Stack Overflow answer显示了如何在这些语言中使用正则表达式匹配anbn。 (根据当前案例调整答案,Java正则表达式^(?:(?:<(?=<*(\1?+>)))+\1)*$应该有效。 更正:不,它不是那么容易调整。)但答案取决于Java支持所有权量词?+(如?,除了你不能回溯它),而JavaScript没有。

那就是说,你可以写下这个来解决参考难题:

^(?:<(?:<(?:<(?:<(?:<(?:<(?:<>)*>)*>)*>)*>)*>)*>)*$

最多匹配七个嵌套级别。这是任何琴弦所拥有的最多,所以这就是你所需要的。 (该页面上的其他几个谜题建议你作弊,因为他们要求技术上不可能的东西;所以虽然优雅的解决方案显然会更具吸引力,但没有理由认为存在一个。)