タグ付けされた質問 「regular-expressions」

正規表現に関する質問、正規言語を記述するための形式主義。

4
有限オートマトンを正規表現に変換する方法は?
正規表現を同じ言語を受け入れる(最小限の)NFAに変換することは、Thompsonのアルゴリズムなどの標準アルゴリズムを使用すると簡単です。しかし、他の方向はより面倒であるように思われ、結果の表現が面倒な場合があります。 NFAを同等の正規表現に変換するためのアルゴリズムは何ですか?時間の複雑さや結果のサイズに関して利点はありますか? これは参考質問になるはずです。メソッドの一般的な説明と重要な例を含めてください。

1
正規表現ゴルフはNP-Completeですか?
この最近のXKCDストリップと最近のブログ投稿に見られるようにPeter Norvig(および後者を特徴とするSlashdotの物語)から、「regex golf」(正規表現分離問題と呼ばれることもあります)は、セットAのすべての単語を受け入れ、単語を受け入れない最短の正規表現を定義するパズルです。セットB. Norvigの投稿には、適度に短い候補を生成するためのアルゴリズムが含まれており、彼のアプローチはNP完全なSet Cover問題の解決を伴うことに注意しますが、そしてもちろん、彼だけが必ずしもアルゴリズムではないため、彼の解が最適であるとは限りません。また、他の確実な多項式時間アルゴリズムが同等またはより良い解を見つける可能性もあります。 具体性のために、また最適化の問題を解決する必要を避けるために、正規表現分離の最も自然な定式化は次のようになると思います。 2(有限)与えられたセットとB、いくつかのアルファベットを超える文字列のΣを、長さの正規表現があり≤ kの中のすべての文字列受け付けAをし、内のすべての文字列を拒否するBは?AAABBBΣΣ\Sigma≤k≤k\leq kAAABBB この特定の分離問題の複雑さについて何か知られていますか?(とBを文字列の有限セットとして指定しているため、問題のサイズの自然な概念はAとBのすべての文字列の合計の長さであることに注意してください。これはkからの寄与を圧倒します)。それは NP完全である可能性が非常に高いと思われますが(実際、何らかのカバー問題への削減が期待されます)、いくつかの検索は特に有用なものを見つけていません。AAABBBAAABBBkkk

4
有限状態オートマトンで後方参照、先読み、および後読みをシミュレートする方法は?
この質問は、Computer Science Stack Exchangeで回答できるため、Stack Overflowから移行されました。 7年前に移行され ました。 単純な正規表現レクサーとパーサーを作成して、正規表現を取得し、その解析ツリーを生成しました。この解析ツリーから非決定性の有限状態オートマトンを作成することは、基本的な正規表現では比較的簡単です。ただし、後方参照、先読み、および後読みをシミュレートする方法について頭を悩ますことはできません。 私がシミュレートA先読みすることを私は理解紫龍の本で読んだことから、正規表現のどこ一致するものが正規表現の一致が続いている場合に限り、一致している、あなたは非決定性有限を作成/がεに置き換えられる状態オートマトン。同じことをする決定性有限状態オートマトンを作成することは可能ですか?r/sr/sr/srrrsss///εε\varepsilon ネガティブな先読みと後読みのシミュレーションはどうですか?これを行う方法を詳細に説明しているリソースにリンクしていただければ幸いです。

6
プログラミング言語、正規表現、形式言語の関係は何ですか
この質問に対する答えをネットで探しましたが、私以外の誰もが暗黙のうちに答えを知っているようです。おそらくこれは、関心のある唯一の人がその主題について高等教育を受けた人だからです。一方、私は高校での宿題の最後に投げ込まれました。 私の質問は、プログラミング言語はどのくらい正確に正式言語に関連していますか?私が読むところはどこでも、「プログラミング言語の文法を定義するために形式言語が使用されている」という言葉があります。 今、私が集めたものから、正式な言語とは、特定の記号セット(言語のアルファベット)に適用される一連の生産規則です。これらの生産ルールは、次のような一連の変換を定義します。 b -> a aaa->c これは次のように適用できます。 abab->aaaa aaaa-> ca 補足として、正式な言語のアルファベットを{a、b、c}と定義すると、aとbは非終端であり、cは変換できないため終端です(間違っている場合は修正してください)それ)。 それを考えると、これはプログラミング言語にどのように当てはまるのでしょうか?また、正規表現を使用してテキスト形式の言語を解析し、文法が正しいことを確認することもよくあります。意味あり。その後、正規表現は正式な言語によって定義されると述べられています。正規表現は、正規表現を表す有限状態オートマトンがゴールポイントに到達したかどうかに応じて、(少なくとも私の経験では)trueまたはfalseを返します。私が見る限り、それは変換とは関係ありません*。 プログラム自体のコンパイルについては、正式な言語がコードを連続的に低レベルのコードに変換し、最終的にハードウェアが理解できる複雑なルールセットを介してアセンブリに到達できると思います。 だからそれは私の混乱した観点からのものです。おそらく、私が言ったことには根本的に間違っていることがたくさんあります。だから私は助けを求めています。 * (a|b)*b*c->trueプロダクションルールのようなものを検討しない限り、その場合、ルールには有限状態オートマトン(つまり、正規表現)が必要です。先ほど言ったように、これは意味がありません

1
「密な」正規表現は
正規表現の推測は次のとおりです。 正規表現RRR場合、長さ|R||R||R|括弧と演算子を無視して、その中のシンボルの数になります。例えば|0∪1|=|(0∪1)∗|=2|0∪1|=|(0∪1)∗|=2|0 \cup 1| = |(0 \cup 1)^*| = 2 推測:場合 およびは、長さすべてのストリングが含まれます以下の場合、。L (R )| R | L (R )= Σ ∗|R|>1|R|>1|R| > 1L(R)L(R)L(R)|R||R||R|L(R)=Σ∗L(R)=Σ∗L(R) = \Sigma^* つまり、がRの長さまで「密」である場合、Rは実際にすべてを生成します。L(R)L(R)L(R)RRRRRR 関連する可能性のあるもの: すべての文字列を生成するために必要なのは、ほんの一部です。バイナリで、例えば、R = (0 ∪ 1 )* ∪ Sは任意のために動作します。RRRR=(0∪1)∗∪SR=(0∪1)∗∪SR = (0 \cup 1)^* \cup SSSS ある時点で Kleene星が必要です。存在しない場合は、|より小さいサイズの文字列が欠落します。R | 。RRR|R||R||R| 証拠や反例を見るといいでしょう。見逃したことが明らかに間違っているケースはありますか?誰もこれ(または似たようなもの)を見たことがありますか?

2
Perl互換の正規表現はどの言語を認識しますか?
タイトルが示すように、私は先週末、Perl互換の正規表現に一致する言語のクラスについて思いを巡らせて、パターン内の任意のコードを実行できるマッチング演算子を除外しようとして数時間を費やしました。 あなたはPCREsが何であるかわからない場合は、お読みください。このとこれを。 問題は、インターネットで利用可能なリソースがコンテキストフリー言語でほとんど停止し、PCREがそれらよりも多く一致する可能性があることです(以下を参照)。しかし、この種のことに関する定理や論文をどこで見つけることができるのか、本当にわかりません。 特に、PCREは明らかに通常の言語のスーパーセットです(PCRE構文にはすべての通常の言語演算子があるため)。 任意のCFGをGreibachの標準形式にすることができます。これにより、左再帰が削除されます。私はこれを(?(DEFINE)...)グループによって使用して、文法を一致するサブルーチンに「翻訳」し、翻訳することによって左再帰でのチョークを回避することができると思います: 各制作の先頭にある非終端記号はサブルーチンになります (?<HEAD>...) 各プロダクションの本体はサブルーチンに入れられます。端末はそのまま残され、非端末はプロシージャ呼び出し(つまり(?&NONTERMINAL))になります。 headと同じ非終端記号を持つすべてのプロダクションは、|演算子を使用してORで結合されます((?:...)必要に応じて、との追加のグループ化) パターンは、(?(DEFINE)...)すべての「翻訳された」プロダクションを含むグループになり、文字列全体に一致する開始シンボルのプロシージャの呼び出し、つまり^(?(DEFINE)...)(?&START)$ これは、すべてのCFGに対処する必要があります。したがって、PCREは任意のCFLと一致できる必要があります。 さらにあります:単純な言語 つまり、文字列の言語を二回繰り返し。この言語はCFLではありません-CFLのポンピング補題は失敗します。(ペイ特に注意することを | VのX ワット| ≤ pが 保持しなければならない、ので、あなただけの始まりまたは2つの繰り返し文字列の端をポンプすることはできません。)L={ww|w∈Λ∗}L={ww|w∈Λ∗}L = \{ ww | w \in \Lambda^* \} |vxw|≤p|vxw|≤p |vxw| \leq p ただし、この言語はPCRE:によって簡単に一致します^(.*)\1$。したがって、厳密にCFLを上回っています。 どれくらいですか?さて、私が言ったように、私にはわからない。CSLやその間の他のすべてのクラスに関するリソースを見つけることができませんでした。これについて議論したい専門家はいますか? 補遺: PCRE構文のどのサブセットを許可する必要があるかを正確に指定するように求められました。投稿の冒頭で書いたように、パターン内の任意のコードの実行を許可する演算子(など)を除外したかったの??{}です。 引数のために、pcresyntax(3)のマニュアルページで定義されている構文に固執できると思います。これは、Perl 5.10-5.12が提供するものの合理的なサブセットで、コールアウト(パターン内にないため)を除きます。バックトラッキング制御動詞を追加または削除しても、認識できる言語が変わるかどうかはわかりません。もしそうなら、どのクラスを取得するか、取得しないかを把握しておくとよいでしょう。

1
単項アルファベットに対する後方参照付きの正規表現
設定: 後方参照付きの正規表現 単項言語(1記号のアルファベット) この設定では、次の問題を決定できますか? 後方参照を含む正規表現が与えられた場合、正規言語を定義しますか? たとえば(aa+)\1、通常の言語を定義しますが、定義し(aa+)\1+ません。どちらが当てはまるかを判断できますか? 具体的には、ここでの「後方参照付きの正規表現」は、たとえば、通常のPerl互換の正規表現の次のサブセットを指します。 a文字に一致しますa(アルファベットの唯一の文字) X* の0回以上の出現に一致します X X|Y一致XまたはY 括弧はグループ化とキャプチャに使用できます \1。\2などは、1番目、2番目などの括弧のペアと同じ文字列に一致します X+=などの通常の略記法も使用できXX*ます。

2
すべての「悪」正規表現に対して、悪ではない代替が存在しますか、または文法に悪魔がありますか?
どうやら、ReDos攻撃はいくつかの(そうでなければ有用な)正規表現の特性を悪用します...本質的にNFAによって定義されたグラフの可能なパスの爆発を引き起こします。 同等の「非悪」正規表現を記述することにより、このような問題を回避することは可能ですか?そうでない場合(したがって、文法はNFAによって実用的な空間/時間で処理できない)、どの構文解析アプローチがより良いでしょうか?どうして?

2
正規表現はですか?
Type 3 Grammarがある場合、プッシュダウンオートマトンで(スタックで操作を行わずに)表現できるため、コンテキストフリー言語を使用して正規表現を表現できます。しかし、解析テーブルを構築せずに、タイプ3の文法が、LL(1)、SLR(1)などであるかどうかを知ることはできますか?LR(1)LR(1)LR(1)LL(1)LL(1)LL(1)SLR(1)SLR(1)SLR(1)

3
Kleeneスターオペレーターは、なぜKleene 'closure'オペレーターとも呼ばれますか?
cs / programming用語の語源を理解していない場合、それは通常、いくつかの重要な基礎概念を逃したか、誤解したことを意味することがわかりました。 KleeneスターがKleeneクロージャーとも呼ばれる理由がわかりません。非ローカル変数がバインドされているプログラミングのクロージャーに関連していますか? ...リフレクションで、多分、それは閉じた表現形式で書かれたオープンエンドのセットを許可するからでしょうか? ...古き良きゴム製のアヒルを説明する方法で、私は今それがそれであると推測しています、しかしまだ権威ある答えを歓迎します。

2
正規表現のクロスワードはNP困難ですか?
先日、このWebサイトhttp://regexcrossword.com/でだまされていましたが、それを解決する最善の方法は何かと疑問に思いました。 次の問題を多項式時間で解決できますか、それともNP困難ですか? 列にN個、行にM個の正規表現を含むNxMグリッドが与えられた場合、すべての正規表現が満たされるようなグリッドの解を見つけるか、解が存在しないと言います。

4
なぜ正規表現に順列がないのですか?(通常の言語でこれができるように見えても)
問題 正規表現で順列を取得する簡単な方法はありません。 順列:数または文字の種類を変更せずに、単語 ( "aabc")を別の順序に取得する。w=x1…xnw=バツ1…バツんw=x_1…x_n 正規表現:正規表現。 確認のため: 「繰り返しのない正規表現順列」答えは、これがより単純であると仮定して、正規表現の代わりにJavaScriptコードを作成します。 「特定のテキスト内の特定の単語のすべての順列を見つける方法」 –答えは正規表現も使用していません。 「すべての{1、2、3、4}を繰り返しなしで照合するための正規表現」 –答えは正規表現を使用しますが、適応可能でも単純でもありません。 この答えはさらに、「正規表現はあなたが望んでいることを実行できません。文字列から順列を生成することはできません」と主張します。 私が探しているソリューションの種類 それは次のような形式でなければなりません: »aabc«(またはその他の開始括弧と終了括弧を使用できます) (aabc)!((abc)に似ていますが、最後に別の記号が付いています) [aabc]!([abc] +に似ていますが、最後に別の記号が付いています) これらのソリューションの利点 彼らです: 簡単 適応可能 再利用可能 これが存在する理由 正規表現は、通常の言語の文法を記述する方法です。彼らはあらゆる種類の通常の言語であるための全力を持っています。 通常の言語は順列に対して十分強力であるとしましょう(以下の証明)–これを表現する簡単な方法がないのはなぜですか? だから私の質問は: (なぜ)私の証拠は間違っていますか? それが正しい場合:順列を表現する簡単な方法がないのはなぜですか? の証拠 正規表現は、正規言語の文法に注意する1つの方法です。通常の言語の文法を記述できます。 通常の言語(アルファベット内の文字数が有限)を説明する別の方法は、(状態の数が有限の)非決定的オートマトンです。 文字数に制限があるため、このオートマトンを作成できます(例:正式:下記を参照) 「abbc」の順列を受け入れる文法: (上の数字を求めてください、おそらく誰かがこの部分をより見栄えよくする方法を知っています) s->ah¹ s->bh² s->ch³ h¹->bh¹¹ h¹->ch¹² h²->ah¹¹(タイプミスなし!同等) h²->bh²² h²->ch²³ h³->ah¹² h³->bh²³ h¹¹-> bc h¹¹-> cb …

1
POSIX BREはすべての標準言語を表現できますか?
POSIX.1-2008で定義されている「Basic Regular Expressions」は代替をサポートしていないようですa|b(ただし、一部のgrep実装はエスケープバージョンを認識しますが\|)。 定義上、通常の言語は結合の下で閉じられているため、これはPOSIX BREが有限オートマトンよりも表現力が低いことを意味しますか?または、他の構造を使用して交互をシミュレートする方法はありますか?

3
2つの正規表現操作だけでは表現できない通常の言語
すべての正規言語は正規表現で表現できると思っていました(言語が正規の場合は正規表現で表現できます)が、そのためには3つの正規操作(連結、結合、スター)がすべて必要であると言われました保持する。 たとえば、共用体と連結の正規表現操作(3つのうち2つ)しか使用できない場合、これら2つだけでは説明できない通常の言語があると言われました。 Kleeneスターとユニオンだけで同じです。これのいくつかの例は何ですか?

1
オートマトンの正規表現と文法の違い
オートマトンは初めてで、昨日だけ正規表現の簡単な紹介を受けました。正規表現を定義するさまざまなルールを読みました。しかし、正規表現と言語の文法を区別することはできません(正規表現の文法は教えられていません)。 文法は言語で有効な文字列を生成するのに役立つことを理解していますが、それが正規表現を定義するためのルールの状態です。それで、違いはどこにありますか?教授に聞いたところ、彼は正規表現は言語の最も基本的な文字列であり、文法はあらゆる言語の規則のセットであり、正規表現よりも高次であると言った。誰かがさらに詳細な情報を提供できますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.