問題
正規表現で順列を取得する簡単な方法はありません。
- 順列:数または文字の種類を変更せずに、単語 ( "aabc")を別の順序に取得する。
- 正規表現:正規表現。
確認のため:
- 「繰り返しのない正規表現順列」答えは、これがより単純であると仮定して、正規表現の代わりに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
h¹²-> bb
h²²-> ac
h²²-> ca
h²³-> ab
h²³-> ba
より正式:(有限状態オートマトンを使用しますが、これは文法でも作成できます)
- 順列が受け入れ状態に到達する必要がある単語q(有限の長さ)。
- Xは有限のアルファベットです。
- 状態のセットSには、qの長さまでの任意の順序の文字が含まれます。(したがって、Sのサイズは有限です。)さらに、「より長い単語」の1つの状態。
- 文字を受け取り、単語の現在読み取られている部分に対応する状態に移動する状態遷移関数d。
- Fは、qの正確な順列である状態のセットです。
したがって、特定の単語の順列を受け入れるための有限状態オートマトンを作成することが可能です。
証明を続ける
ですから、通常の言語には順列をチェックする力があることを証明しましたね。
それでは、なぜRegexesでこれに到達するアプローチがないのですか?便利な機能です。
^(a()|a()|b()|c()){4}\2\3\4\5$
(参照作業に思えるregex101.com/r/9URPpg/4/testsを)。