14

コードで正規表現を取得しました。これは、URL のパターンに一致し、エラーをスローしました。

/^(http|https):\/\/([\w-]+\.)+[\w-]+([\w- .\/?%&=]*)?$/

エラーは「charクラスエラーの空の範囲」でした。その原因は([\w- .\/?%&=]*)?一部にあることがわかりました。Ruby は inをリテラルではなく範囲の演算子として認識-するようです。ダッシュにエスケープを追加した後、問題は解決しました。\w- .-

しかし、元の正規表現は同僚のマシンでうまく動作しました。osx、rails、ruby の同じバージョンを使用します。Ruby のバージョンは ruby​​ 1.9.3p194、rails は 3.1.6、osx は 10.7.5 です。コードを Heroku サーバーにデプロイした後も、すべてが正常に機能しました。この正規表現に関して、私の環境だけでエラーが発生したのはなぜですか? Rubyの正規表現解釈の仕組みとは?

4

1 に答える 1

18

このエラーは、rvm1.13.4を使用してUbuntu12.04.1LTSにインストールされたRuby1.9.3p194(2012-04-20リビジョン35410)[i686-linux]で再現できます。ただし、これはバージョン固有のエラーではありません。実際、他のマシンでもまったく機能しなかったのには驚いています。

同様に失敗するより単純なデモンストレーション:

"abcd" =~ /[\w- ]/

これは、[\w- ]意図した単語、ハイフン、またはスペースを含む文字クラスではなく、「任意の単語文字からスペース(または空白)までの範囲」として解釈されるためです。

Rubyの正規表現ドキュメントによると

文字クラス内では、ハイフン(-)は、文字の包括的範囲を示すメタ文字です。[abcd]は[ad]と同等です。ある範囲の後に別の範囲を続けることができるため、[abcdwxyz]は[a-dw-z]と同等です。範囲または個々の文字が文字クラス内に表示される順序は関係ありません。

ご覧のとおり、バックスラッシュを前に付けるとハイフンがエスケープされ、正規表現の性質が範囲から文字クラスに変更され、エラーが削除されました。ただし、文字クラスの途中でハイフンをエスケープすることはお勧めしません。そのような場合、ハイフンの意図された意味を混乱させやすいからです。m.buettnerが指摘したように、常に文字クラスの最初または最後にハイフンを配置します。

"abcd" =~ /[-\w ]/
于 2012-11-08T08:57:29.457 に答える