2

文字クラスで後方参照を使用できないことは認識していますが、この機能が必要です。これを達成するために使用できる代替の有効な正規表現があるかどうか疑問に思っています。

前提条件: Visual Studio 2013 を使用しています。その環境 (つまり、std::regex) 内で動作する必要があります。

簡単な例として、私が実行したいのは、大文字のローマ字アルファベットのみ (つまり AZ) の単語リストでの検索です。たとえば、次のような仮説的な表現です。

"^(.)([A-\1])([\2-Z])$"

これは理想的には、2 番目の文字が語彙的に 1 番目の文字以下であり、3 番目の文字が語彙的に 2 番目の文字以上である 3 文字の単語の一致を返します。一致の例には、「CAT」と「EEL」が含まれますが、「COW」と「PIG」は含まれません。

では、これを達成できるやや単純な正規表現 (26×N 指数代替条件を除く) はありますか? それとも、これを行うために独自のコードを作成する必要がありますか?

補遺:単純化されたケースの代替の有効な正規表現を受け取っていないので、そのような検索を実行するための独自のコードを書く必要があるという点で、私の質問に答えると思います。

現実の問題を理解するために、ここで説明します。

http://joeslater.orgfree.com/ZigWord/tutorial.html

問題を理解するにはチュートリアルで十分でしょうが、いくつかのパズルが用意されていますので、ぜひ試してみてください。それらはすべて手作業で生成されました。選択する単語のリストを使用して、このようなパズルを生成するプログラムが必要です。

本当の問題は、パズルのサイズが 9×9 や 11×11 のグリッドのように大きくなり、大量の単語リスト (数百または数千) がある場合に発生します。パズルが構築されるにつれて、各単語が埋められていない場所に収まるようにする力ずくの方法は、容認できない解決策です。 11×11 パズル (パズルは生成されませんでした)。

そのため、パズルが構築され、パズルに収まる可能性のある単語を除外するために、正規表現を使用したいと考えていました。現時点では、この検索を実行するには独自のコードを作成する必要があると思いますが、そうでない場合は教えてください。

4

4 に答える 4

0

文字クラス内で16進コードを使用できます。したがって、1つのアプローチは、検索hex codeする$1\1、内部に配置することcharacter classです。実行時に正規表現を作成する必要があります。このようなもの

https://regex101.com/r/tX2bH4/57

ここ\x43Cハードコーディングされていますが、置き換える前に簡単に見つけることができます。

疑似正規表現は

^(.)([A-(hex code of \1)])([(hex code of \2)-Z])$

         ^^                   ^^

これらは、テーブルを検索して の 16 進コードを取得する小さなコードに置き換えられます\1

于 2015-01-21T05:06:29.713 に答える
0

これは、ハイブリッド アプローチの良い例です。単純な正規表現を使用して一致候補を生成し、カスタム ロジックでそれらを自分でフィルター処理します。

于 2015-01-21T05:03:02.160 に答える
0

ご意見をお寄せいただきありがとうございます。ハイブリッド アプローチを使用することにしました。たとえば、最初の仮説式が次の場合:

"^(.)([A-\1])([\2-Z])$"

このような式は有効な正規表現ではなく、カスタム コードで処理する必要がありますが、後で 2 番目の文字が I であることが判明すると、式は次のようになります。

"^([IZ])([I])([IZ])$"

これは、「PIT」または「SIT」に一致する有効な正規表現として使用できます。

于 2015-01-28T13:37:04.260 に答える