2

正規表現を使用して、いくつかのコードで一致するものを見つけようとしています。

私が使用している文字列

"input[type=radio],input[type=checkbox] {"

これに一致させるために、すべてのブラケットにエスケープ文字を追加しました。

"input\[type=radio\],input\[type=checkbox\] \{"

そして.match、特定のコード行で一致するものを見つけるために実行しています。

"input[type=radio],input[type=checkbox] {".match(/input\[type=radio\],input\[type=checkbox\] \{/)

どちらが機能しますか。しかし、それらを変数に変換すると、そうではありません。

str = "input[type=radio],input[type=checkbox] {"
code_to_match_against = "input\[type=radio\],input\[type=checkbox\] \{"

str.match(/#{code_to_match_against}/) # => nil

私は何が間違っているのですか?

4

1 に答える 1

3

ここでの二重引用符:

code_to_match_against = "input\[type=radio\],input\[type=checkbox\] \{"

バックスラッシュを食べています。このことを考慮:

>> code_to_match_against = "input\[type=radio\],input\[type=checkbox\] \{"
>> p code_to_match_against
"input[type=radio],input[type=checkbox] {"

したがって、正規表現に補間code_to_match_againstすると、正規表現エンジンは2つの文字クラスを使用していると見なします。

/input[type=radio],input[type=checkbox] {/
#     ^^^^^^^^^^^^      ^^^^^^^^^^^^^^^

および文字クラスは、一度に1つの文字にのみ一致します(*またはを追加しない限り+)。

バックスラッシュを2倍にして二重引用符を超えるか、代わりに一重引用符を使用します。

>> code_to_match_against = 'input\[type=radio\],input\[type=checkbox\] \{'
>> p code_to_match_against
"input\\[type=radio\\],input\\[type=checkbox\\] \\{"
>> puts code_to_match_against
input\[type=radio\],input\[type=checkbox\] \{
于 2012-10-09T01:25:56.783 に答える