2013-12-22 33 views
6

我會認爲這個問題是不可能的;據我所知,Javascript的正則表達式沒有遞歸插值,也沒有漂亮的.NET平衡組特徵。然而,在regex.alf.nu的問題12中:匹配<>的平衡配對。除非套中還有一些其他的模式,我沒有得到。如何在JavaScript正則表達式中匹配平衡分隔符?

所以......這是可能的嗎?如果是這樣,怎麼樣?

注:

  1. 我知道,這是不可能實現真正的正則表達式,但基於挑戰似乎它必須在Javascript的味道有可能(至少是足夠不規則的有反向引用)。我只是不知道會讓他們這樣做的任何功能。

  2. 沒有其他代碼 - 表單允許輸入單個正則表達式,該正則表達式針對頁面上的測試字符串進行評估。我想可以嘗試破解頁面以打破正則表達式,並轉化爲原始JS,但這似乎並不符合這一挑戰的精神。

自David問起,這裏是測試字符串。較長的字符已被截斷爲字符數,但問題標題爲「平衡」,而完成的問題肯定支持「匹配」列具有平衡對<>的假設,而「非」列不支持。

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

是否允許使用其他JavaScript代碼?如果是這樣,只需實施一堆「開始」匹配,然後在找到'結束'匹配時展開它們。 –

+1

你描述的語言並不經常。 –

+0

你如何將[matche這些]和[但不是這些]粘貼到你的問題中? –

回答

6

我不認爲這是可能的JavaScript,雖然很難證明。例如,Java和PHP不具備您提到的功能(遞歸插值,平衡組),但this fascinating Stack Overflow answer顯示如何使用這些語言中的正則表達式匹配anbn。 (適應這個答案本案中,Java正則表達式^(?:(?:<(?=<*(\1?+>)))+\1)*$應該工作更正:沒有,它不是那麼容易適應。)但是這個答案對於佔有慾量詞?+(如?依賴於Java的支持,除了你不能回溯到它),JavaScript沒有。

也就是說,你可以通過編寫此解決引用之謎:

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

相匹配多達七個級別的嵌套。這是所有字符串中最多的,所以這就是你所需要的。 (該網頁上的其他幾個謎題建議你作弊,因爲他們要求一些技術上不可行的東西;所以雖然優雅的解決方案顯然更具吸引力,但沒有理由假設存在一個問題。)

+0

作弊的好點。 –

+0

我讀了頁面的源代碼,它檢查的是正則表達式是否工作。正如你所說,沒有任何跡象表明存在更優雅的答案,也不會獎勵更高分。 – Rhyono

+0

Java也不能進行括號匹配。我們需要遞歸正則表達式(子例程)語法,Java不支持(AFAIK)。 – nhahtdh

相關問題