2013-12-22 7 views
6

私はこの問題を不可能と考えていたでしょう。私の知る限り、Javascriptの正規表現のフレーバには、素早く再帰的な補間や素晴らしい.NETバランシンググループの機能があります。それでも、regex.alf.nuの問題12として、<>のバランスの取れたペアがマッチしています。セットに他のパターンがない限り、私は得られない。javascriptの正規表現で平衡区切り記号をどのように一致させるには?

これは可能ですか?もしそうなら、どうですか?

NOTES:

  1. 私はこれが真の正規表現のために不可能であることを知っているが、課題に基づいて、それは、少なくとも十分な不規則持つことである(それはJavascriptの味で可能でなければならないようです後方参照)。私はちょうど彼らがこれを行うことができる任意の機能を知らない。

  2. 他のコードはありません - このフォームは、ページ上のテスト文字列に対して評価される単一の正規表現の入力を許可します。私は、正規表現から抜け出すために、ページを解読しようとする可能性があります、私は思いますが、それはこの挑戦の精神にあるようには見えません。

ここからはテスト文字列があります。長いものは文字数で切り捨てられていますが、問題は「残高」と題されており、完全なものは確かに「一致」列に平均ペア<>があるという仮説を支持していますが、 。

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コードを使用するには?そうであれば、 'start'マッチのスタックを実装し、 'end'マッチが見つかるとそれらを巻き戻します。 –

+1

あなたが記述する言語は規則的ではありません。 –

+0

あなたはあなたの質問に[matche these]&[but not these]のセットを貼り付けていかがですか? –

答えて

6

私はJavaScriptでこれが可能であるとは思わないが、証明するのは難しい。たとえば、JavaやPHPにはあなたが言及している機能(再帰的補間、グループのバランス)はありませんが、this fascinating Stack Overflow answeranbnの正規表現をどのように使ってそれらの言語で一致させるかを示しています。 (が存在する場合にその答えを適応、Javaの正規表現^(?:(?:<(?=<*(\1?+>)))+\1)*$が動作するはず補正:。。いいえ、それは容易に適合しません)しかし、その答えは、ことを除いて所有数量詞?+(のような?ためのJavaのサポートに依存あなたはそれに逆戻りすることはできません)、JavaScriptはそれを持っていません。

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

ネスティングの7つのレベルまで一致している:あなたはこれを記述することで参照パズルを解くことができる、と述べた

。それは文字列のどれかがもっとも多いので、必要なのはそれだけです。 (そのページの他のパズルのいくつかは、技術的に不可能なものを求めているため、不正行為を勧めているので、優雅なソリューションは明らかに魅力的ですが、存在すると推測する理由はありません)

+0

に役立つかもしれません。 –

+0

私はページのソースコードを読んで、それがチェックするのは、正規表現が動作しているかどうかです。あなたが言ったように、より洗練された答えが存在することも、より高い点を与えることもないことを示唆するものはありません。 – Rhyono

+0

Javaでもブラケットマッチングはできません。 Javaがサポートしていない再帰的正規表現(サブルーチン)構文(AFAIK)が必要です。 – nhahtdh

関連する問題