2013-05-28 61 views
1

在下面的代碼中,我想驗證messageText與第一個validationPattern並顯示來自validationPatterns數組的相應消息。模式和消息由管道分隔「|」字符。正則表達式javascript返回意外結果

爲此我使用下面的代碼,並總是得到錯誤的結果。有人可以看看這個並幫助我嗎?

var messageText = "Message1234"; 
var validationPatterns = [ 
    ['\/^.{6,7}$/|message one'], 
    ['\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b|message two'] 
]; 
for (var i = 0; i < validationPatterns.length; i++) { 
    var validationvalues = validationPatterns[i].toString(); 

    var expr = validationvalues.split("|")[0]; 
    console.log(expr.constructor); 

    if(expr.test(messageText)) { 
     console.log("yes"); 
    } else { 
     console.log("no"); 
    } 
} 

我知道我們不能使用管道作爲分隔符,因爲管道也是正則表達式的一部分。不過,我稍後會改變這一點。

+1

*意外結果*是什麼意思?你得到了什麼,你期望什麼?當我嘗試運行代碼時,出現運行時錯誤:'TypeError:Object /^.{6,7}$/'沒有方法'test''。而不是使用一個字符串來保存由'|'分開的兩個值,我會使用一個數組。 –

回答

2

您的validationpatterns是字符串。這意味着:

  • 反斜槓被吃掉,因爲它們只是字符串轉義以下字符。 "\b"相當於"b"。你需要加倍轉義他們:"\\b"
  • 你不能調用他們的test方法。您需要從中構建RegExp objects

雖然有可能解決這個問題,但如果您只是使用正則表達式文字並將它們作爲對象(或數組中的不同屬性)分隔消息,會更好。

var inputText = "Message1234"; 
var validationPatterns = [ 
    [/^.{6,7}$/, 'message one'], 
    [/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/, 'message two'] 
]; 
for (var i = 0; i < validationPatterns.length; i++) { 
    var expr = validationPatterns[i][0], 
     message = validationPatterns[i][1]; 
    console.log(expr.constructor); // RegExp now, not String 

    if(expr.test(inputText)) { 
     console.log(message+": yes"); 
    } else { 
     console.log(message+": no"); 
    } 
} 
+0

謝謝你解決了我的問題。我沒有考慮使用2D陣列:( – rajmalhotraml

+0

@rajmalhotraml:實際上,你已經做到了,只有它內部只包含一個字符串。 – Bergi

+0

@rajmalhotraml錯誤非常明顯!!!以及爲什麼使用錯誤消息以及可以使用i值來猜測錯誤消息的表達式。 –

1

您的expr變量仍然只是一個字符串(validationvalues.split("|")[0]將返回一個字符串)。這就是它不能用作正則表達式的原因。

您需要在初始定義expr後添加一行。

expr = new RegExp(expr, 'i'); 

「i」只是您如何使用不區分大小寫的標誌或其他標誌的示例。如果您想區分大小寫搜索(默認),請使用空字符串。

另外,您需要取出//,它們圍繞您的第一個模式。只有在JavaScript代碼中使用正則表達式文字時才需要它們,並且在將字符串轉換爲正則表達式時不需要它們。

+0

謝謝你的回答。我試過這個問題,但經過幾次迭代解決我錯過了。 當我使用這一行時,無論messageText變量中有多少個字符,我都會得到結果「no」。 – rajmalhotraml

+0

請在前面的回答幫助下解決這個問題。 – rajmalhotraml