2013-05-15 90 views
6

我正在使用從regexlib獲取的正則表達式模式來驗證相關URL。在他們的網站上,您可以test模式來確保它符合您的需求。一切都在其網站上的偉大工程,只要我在我的使用模式我收到錯誤消息:Javascript正則表達式在字符類中的無效範圍

範圍無效字符類

我知道這個錯誤通常意味着一個連字符錯誤地被用來表示一個範圍,並沒有適當地逃脫。但在這種情況下,因爲它在他們的網站上工作,我很困惑爲什麼它不適用於我的網站。

var urlRegex = new RegExp('^(?:(?:\.\./)|/)?(?:\w(?:[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]]|(?:%\d\d))*\w?)?(?:/\w(?:[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]]|(?:%\d\d))*\w?)*(?:\?[^#]+)?(?:#[a-z0-9]\w*)?$', 'g'); 

注: 如果你打算從他們的網站測試正則表達式(使用上面的鏈接),務必將Regex Engine下拉菜單Client-side EngineEngine下拉菜單更改爲Javascript

回答

10

要麼把-開始字符類的使用兩個反斜槓字符串中做一個正則表達式逃逸

,因爲你正在使用的字符串,你需要使用兩個反斜槓爲每個特殊字符。


注意

檢查出SO this答案,解釋時使用單或雙反斜線轉義特殊字符

+0

我把它移到兩個字符類結束,但現在我得到'無效quantifier' – bflemi3

+0

不能我也加倍逃避連字符,即('\\ -')而不是將它移動到最後? – bflemi3

+0

@ bflemi3是的,你確實可以逃脫它..檢查出我在ans – Anirudha

4

沒有理由在這裏使用RegExp構造。只需使用RegExp文字:

var urlRegex = /^(?:(?:\.\.\/)|\/)?(?:\w(?:[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]]|(?:%\d\d))*\w?)?(?:\/\w(?:[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]]|(?:%\d\d))*\w?)*(?:\?[^#]+)?(?:#[a-z0-9]\w*)?$/g; 
      ^  ^^               ^                     ^

裏面RegExp文字,你只寫正則表達式的自然,除了/,現在需要逃避,因爲/RegExp文字作爲分隔符。

在字符類,^具有在字符類的開頭特殊的含義,-具有2個字符之間特殊的意義,和\具有特殊的意義,這是逃避其他字符(主要^-[]\),並指定速記字符類(\d,\s,\w,...)。 []被用作字符類的分隔符,所以它們也有特殊的含義。 (實際上,在JavaScript中,只有]具有特殊含義,並且您可以指定[而不會在字符類中轉義)。除了上面列出的5個字符外,其他字符(除非涉及\的轉義序列)沒有任何特殊含義。

您可以使用上述信息減少轉義\的數量。對於^,除非它是字符類中唯一的字符,否則可以將它從字符類的開始處放開。對於-,可以將其放在字符類的末尾。

var urlRegex = /^(?:(?:\.\.\/)|\/)?(?:\w(?:[\w`~!$=;+.^()|{}\[\]-]|(?:%\d\d))*\w?)?(?:\/\w(?:[\w`~!$=;+.^()|{}\[\]-]|(?:%\d\d))*\w?)*(?:\?[^#]+)?(?:#[a-z0-9]\w*)?$/g; 

什麼改變:

[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]] 
[\w`~!$=;+.^()|{}\[\]-] 
相關問題