1

私はこの正規表現を作成しました。これは、たとえばRegExrでテストしたときに必要なことを正確に実行します。

^https?:\/\/(www\.)?(test\.yahoo\.com|sub\.yahoo\.com)?(?!([a-z0-9]+\.)?(localhost|yahoo\.com))(.*)?

ただし、JavaScriptでテストすると、式が無効であると表示されます。何時間もデバッグした後、この式がjavascriptで機能することがわかりました。

^https?:\/\/(www\.)?(test\.yahoo\.com|sub\.yahoo\.com)?(?![a-z0-9]+\.)?(localhost|yahoo\.com)(.*)?

しかし、これは私が望むことをしません(再びRegExrでテストします)。

JavaScriptで最初の式を使用できないのはなぜですか?そして、どうすれば修正できますか?

7月25日更新

情報不足でごめんなさい。私が正規表現を使用している方法は、正規表現を使用して選択できるjQuery拡張機能を使用することです。スクリプトはここで見ることができます:http://james.padolsey.com/javascript/regex-selector-for-jquery/

私が機能させようとしている特定のコードは次のとおりです。

$('a:regex(href, ^https?:\/\/(www\.)?(test\.yahoo\.com|sub\.yahoo\.com)?(?!([a-z0-9]+\.)?(localhost|yahoo\.com))(.*)?)').live('click', function(e) {

リンクされたjQueryプラグインを含めた後。私がテストしているテキスト文字列は次のとおりです。

「http://google.dk」、「http://test.yahoo.com」、「http://sub.yahoo.com/lalala」と一致するはずの場所-RegExrを使用しているが失敗した場合(無効な式)jQueryプラグインを使用します。

4

1 に答える 1

3

最初の正規表現は無効ではありません。

var regexp = /^https?:\/\/(www\.)?(test\.yahoo\.com|sub\.yahoo\.com)?(?!([a-z0-9]+\.)?(localhost|yahoo\.com))(.*)?/;

正常に動作します。

文字列から式をインスタンス化する場合は、すべての円記号を2倍にする必要があります。

var regexp = new RegExp("^https?:\\/\\/(www\\.)?(test\\.yahoo\\.com|sub\\.yahoo\\.com)?(?!([a-z0-9]+\\.)?(localhost|yahoo\\.com))(.*)?");

文字列から始める場合、文字列定数自体が引用符のメカニズムとしてバックスラッシュを使用するという事実を考慮する必要があるため、2つの評価が行われます。1つは文字列として、もう1つは正規表現としてです。

編集—OK私は問題が発生したと思います。使用しようとしているプラ​​グインは、Sizzleがセレクターを解析する方法を考えると、単に機能しないことを実行しようとしているだけです。言い換えれば、問題は正規表現ではなく、セレクター全体にあります。正規表現を解析するのに十分な距離にさえ達していません。

具体的には、正規表現内にネストされた括弧のようです。と同じくらい簡単なもの

$('a:regex(href, ((abc)))')

エラーが発生します。代わりに、次のようなことを行うことができます。

$('a').filter(function() {
  return /^https?:\/\/(www\.)?(test\.yahoo\.com|sub\.yahoo\.com)?(?!([a-z0-9]+\.)?(localhost|yahoo\.com))(.*)?/.test(this.href);
}).whatever( ... );
于 2012-07-25T13:06:13.630 に答える