同じ一致基準を複数の区切り記号に適用できる正規表現があります。 []
、()
、および<>
はすべて有効です。例として、次のようになります。
\[.\]|\(.\)|<.>
上記の正規表現から冗長性を取り除く方法はありますか? 区切り文字内の一致基準は常に同じですが、区切り文字自体は異なる場合があります。
実際にPCRE ライブラリを (たとえば PHP 経由で) 使用している場合は、次のように DEFINE グループを使用してサブルーチンを作成できます。
'~(?(DEFINE)(?<content>\w+))(?:<(?&content)>|\[(?&content)\]|\((?&content)\))~'
...またはより読みやすく:
(?(DEFINE)(?<content>\w+))
(?:
<(?&content)>
|
\[(?&content)\]
|
\((?&content)\)
)
PHPでのデモを次に示します。Perl でも動作するはずです。
私はあなたが尋ねていると思います
[[(<].[])>]
明らかな理由から、十分に正確ではありません。
「いいえ、そんな方法はありません」と答えるのは常に危険です。そのような場合に答えるには、多くの場合、確固たる証拠を考え出さなければなりません。
これが十分に強力な証明であるか、または「証明」でさえあるかどうかはわかりませんが、次の (疑似) 情報理論の観点を考慮してください。
PCRE エンジン自体は、[]
、()
、およびのペアの関係を認識していません<>
。したがって、式自体にその情報が含まれている必要があります。つまり、少なくとも6 文字が存在する必要[]()<>
があります。
それだけでなく、同じ理由で、式自体で少なくとも2 つのペアリングを定義する必要があります(3 つ目は暗黙のうちに残します)。|
2 つの代替演算子 ( ) が最適であることを証明する方法はわかりませんが、よりコンパクトな方法があったとしても、せいぜい 1 文字しか節約できないということです。「ペアリングが存在します!」と言う必要があります。
メタ文字のエスケープは、エスケープされずに文字クラス内に出現できるという事実によってのみ圧縮[]()
できますが、第一に、それは「構文上の幸運な状況」であるほど、実際には「冗長性の除去」ではありません。次に、上記の文字クラスの定義に 2 つの文字を追加する必要があります[]
。
したがって、理論的な観点からでも、正規表現エンジンが認識できないことについての私の推測が正しい場合、既に提供されている正規表現から最大で3 文字を節約できると私は信じています\[.\]|\(.\)|<.>
。
正規表現の達人によって修正されることを楽しみにしています!