20

複製:

正規表現に一致するランダムな文字列

いいえ、そうではありません。実際に実装できる、簡単で普遍的な方法を探しています。これは、パスワードをランダムに生成するよりもはるかに困難です。


正規表現を取り、その式に一致するランダムに生成された10個の文字列を表示するアプリケーションを作成したいと思います。これは、人々が正規表現をよりよく理解し、検証目的で十分に安全であるかどうかを判断するのに役立つはずです。誰かがそれを行う簡単な方法を知っていますか?

明らかな解決策の1つは、正規表現パーサーを作成(または盗む)することですが、それは本当に頭に浮かぶようです。

繰り返しますが、私はそれを行うための簡単で普遍的な方法を探しています。

編集:ブルートフォースアプローチは問題外です。ランダムな文字列が1秒あたり100万回の反復であると仮定すると、10文字の文字列すべてのスペースを反復処理[a-z0-9]{10}するのに65年かかります。

4

5 に答える 5

24

正規表現をDFAに解析してから、受け入れ状態になるまでDFAをランダムにトラバースし、遷移ごとに文字を出力します。各ウォークは、式に一致する新しい文字列を生成します。

ただし、これは、後方参照のある式など、実際には正規ではない「正規」式では機能しません。それはあなたがどんな表現を求めているかによります。

于 2009-04-14T16:00:51.427 に答える
6

PerlのString::Randomを見てください。

于 2009-04-14T16:04:11.373 に答える
0

実用的かもしれないし、そうでないかもしれない1つのかなり醜い解決策は、既存の正規表現診断オプションを活用することです。一部の正規表現ライブラリには、正規表現が一致しなかった場所を特定する機能があります。この場合、実際にはブルートフォースの形式を使用できますが、一度に1つの文字を使用し、完全に一致するまで、より長い(さらに一致する)文字列を取得しようとします。これは非常に醜い解決策です。ただし、標準のブルートフォースソリューションとは異なり、abのような文字列で失敗すると、一致する文字列ab。*が存在するかどうかもわかります(存在しない場合は、停止してacを試してください。存在する場合は、より長い文字列を試してください)。これは、すべての正規表現ライブラリで実行できるとは限りません。

明るい面では、この種のソリューションは、教育の観点からはおそらくかなりクールです。実際には、それはおそらく事実上dfaソリューションと似ていますが、dfaについて考える必要はありません。

この手法ではランダムな文字列を使用したくないことに注意してください。ただし、ツリーでテストした内容を追跡している場合は、ランダムな文字を使用して開始できるため、効果は同じです。

于 2009-04-14T18:53:53.647 に答える
-1

あなたの唯一の基準があなたの方法が簡単で普遍的であるということであるならば、ブルートフォースほど簡単で普遍的なものはありません。:)

for (i = 0; i < 10; ++i) {
    do {
        var str = generateRandomString();
    } while (!myRegex.match(str));
    myListOfGoodStrings.push(str);
}

もちろん、これは物事を行うための非常にばかげた方法であり、ほとんどが冗談として意図されていました。

あなたの最善の策は、あなた自身の非常に基本的なパーサーを書いて、あなたが遭遇することを期待していることだけを教えることだと思います(例えば:文字と数字の範囲、繰り返し/オプションの文字...見た目を気にしないでください-後ろなど)

于 2009-04-14T16:03:31.967 に答える
-2

普遍性の基準は不可能です。正規表現「生きるべきか、死ぬべきか-それが質問:$」であるとすると、一致する10個の一意のランダムな文字列はありません。

非縮退の場合:

moonshadowのPerlのString::Randomへのリンクがその答えです。stdinからRegExを読み取り、String::Randomの10回の呼び出しからの出力をstdoutに書き込むPerlプログラムは簡単です。Perl2exeを使用してWindowsまたはUnixexeにコンパイルし、PHP、Pythonなどから呼び出します。

正規表現に基づくランダムテキストジェネレータも参照してください。

于 2009-04-14T16:10:43.183 に答える