2011-05-19 17 views
6

我這塊VBNet代碼,我想翻譯成JavaScript:錯誤從.NET正則表達式轉換爲JavaScript

Dim phone_check_pattern = "^(\+?|(\(\+?[0-9]{1,3}\))|)([ 0-9.//-]|\([ 0-9.//-]+\))+((x|X|((e|E)(x|X)(t|T)))([ 0-9.//-]|\([ 0-9.//-]+\)))?$" 
    System.Diagnostics.Debug.WriteLine(System.Text.RegularExpressions.Regex.IsMatch("test input", phone_check_pattern)) 

我的翻譯結果:

var phone_check_pattern = "^(\+?|(\(\+?[0-9]{1,3}\))|)([ 0-9.//-]|\([ 0-9.//-]+\))+((x|X|((e|E)(x|X)(t|T)))([ 0-9.//-]|\([ 0-9.//-]+\)))?$"; 
alert(new RegExp(phone_check_pattern).test("test input")) 

然而,當我運行它它的主要錯誤Uncaught SyntaxError: Invalid regular expression:: Nothing to repeat

(我VbNet代碼沒有任何雖然錯誤)

有誰知道是什麼原因導致了這個問題?

+0

@Prier你可以告訴我們regEx是應該做什麼。 – sra 2011-05-19 08:11:55

+1

@sra:他正在承擔強大的工作(有些人甚至會說Quixotic)驗證在自由格式字段中輸入的電話號碼。不是因爲心臟不好,容易出現各種各樣的問題。 – 2011-05-19 08:13:19

+1

@sra其在問題中陳述的內部代碼 – Pacerier 2011-05-19 08:55:07

回答

7

JavaScript字符串中的反斜槓字符是一個轉義字符,因此您字符串中的反斜槓將爲字符串轉義字符,而不是正則表達式。所以就在接近開始時,在你的"^(\+?中,那裏的反斜槓恰好跳過+的字符串(它不需要),而正則表達式看到的僅僅是一個原始的+,沒有什麼可重複的。因此錯誤。

幸運的是,JavaScript有正則表達式和文本語法(以/字符分隔),這可能會是您更好的起點:

var re = /^(\+?|(\(\+?[0-9]{1,3}\))|)([ 0-9.\/-]|\([ 0-9.\/-]+\))+((x|X|((e|E)(x|X)(t|T)))([ 0-9.\/-]|\([ 0-9.\/-]+\)))?$/; 
alert(re.test("test input")); 

那麼至少反斜線在正則表達式逃逸,不是字符串。 (請注意,由於/是正則表達式的分隔符,因此我們必須將其轉義(使用反斜槓)。)

我沒有詳盡回顧實際的正則表達式,但是應該讓您開始。

更多關於the spec的正則表達式文字,當然還有here on MDC

2

我不知道,但嘗試在JavaScript代碼中使用\\而不是\。看到一些樣品,這樣做。

1

正如大家所說,雙斜線很重要。這工作:

var phone_check_pattern = "^(\\+?|(\\(\\+?[0-9]{1,3}\\))|)"+ 
    "([ 0-9.//-]|\\([ 0-9.//-]+\\))+"+ 
    "((x|X|((e|E)(x|X)(t|T)))([ 0-9.//-]|\\([ 0-9.//-]+\\)))?$"; 

var re = new RegExp(phone_check_pattern); 
say(re.test("test input")); 
say(re.test("(415) 828-3321")); 
say(re.test("+1 (212) 828-3321")); 
say(re.test("da828-3321")); 
相關問題