パターンをオプションの周囲の引用符と一致させるにはどうすればよいですか?
-
01-10-2019 - |
質問
引用符を含むパターンに一致する正規表現をどのように書くのでしょうか。
"?(pattern)"?
引用から始まるが、それで終わらないパターンを許可するため、機能しません。
"(pattern)"|(pattern)
動作しますが、繰り返しです。パターンを繰り返すことなく、それを行うより良い方法はありますか?
解決
あなたは、繰り返すことなく解決策を取得することができます 後方 と 条件:
/^(")?(pattern)(?(1)\1|)$/
マッチ:
- パターン
- "パターン"
一致しない:
- "パターン
- パターン"
ただし、このパターンはやや複雑です。最初にオプションの見積もりを探し、見つかった場合はbackreference 1に入れます。次に、パターンを検索します。次に、条件付き構文を使用して、「BackReference 1が再度見つかった場合、それに合わせて、それ以外の場合は何も一致しません」と言います。パターン全体がです 固定されています (つまり、一致していない引用がキャプチャされないように、それ自体でそれ自体で表示する必要があることを意味します) pattern
の pattern"
一致します)。
条件のサポートはエンジンによって異なり、より冗長だが反復的な表現がより広くサポートされる(そしておそらく理解しやすい)ことに注意してください。
アップデート: このREGEXのはるかにシンプルなバージョンはそうでしょう /^(")?(pattern)\1$/
, 、条件付きは必要ありません。私が最初にこれをテストしていたとき、私が使用していたテスターは私に偽陰性を与えてくれました。
ソリューションは後世と関心のために条件付きのままにしておきますが、これはより単純なバージョンであり、より多くの種類のエンジンで機能する可能性が高くなります(ここで使用されている唯一の機能がサポートされていない可能性があります)。
他のヒント
使用している言語に応じて、背景を使用できるはずです。このようなもの、言う:
(["'])(pattern)\1|^(pattern)$
そうすれば、引用符がないか、同じ引用が両端に使用されることを要求しています。
これは、再帰的な正規表現で動作するはずです(正しくなるにはもっと長く必要です)。それまでの間:in Perl, 、aを構築できます 自己修正修復. 。それを学問的な例として残します;-)
my @stuff = ( '"pattern"', 'pattern', 'pattern"', '"pattern' );
foreach (@stuff) {
print "$_ OK\n" if /^
(")?
\w+
(??{defined $1 ? '"' : ''})
$
/x
}
結果:
"pattern" OK
pattern OK