2016-11-11 21 views
1

我正在嘗試在Angular中創建一個可以從遠程端點配置的輸入指令。從對象屬性(string)構造JavaScript中的RegExp

下面的對象應該產生一個輸入字段type=text,只有當輸入是一個6位數的數字時才應該設置爲有效。

{ 
    inputfield: { 
     "name": "6-digit code", 
     "type": "text", 
     "pattern": "/^\d{6}$/" 
    } 
} 

我遇到的問題是,如果我使用$setValidity和檢查值與正則表達式從pattern產生我得到以下幾點:

var pattern = new RegExp("^\d{6}$"); 

console.log(pattern.toString()); 
=> "/^d{6}$/" 

這很好,因爲\如預期的那樣逃脫。我有權訪問提供數據的端點。該端點是用Java編寫的REST端點。因此,在端點上的正則表達式定義如下:

String regex = "/^\\d{6}$/"; 

所以,總結一下:

From endpoint: "/^\\d{6}$/" 
Received at client: "/^\d{6}$/" 
Constructing RegExp from the received object gives: "/^d{6}$/" 
Wanted RegExp: /^\d{6}$/ 

才能實現這一目標,而不在與quadrouple斜槓(即"/^\\\\d{6}$/")端點聲明正則表達式?

+0

https://www.google.com/search?q=pass%20backslash%20in%20json – mplungjan

回答

3

下面的對象應該產生一個輸入字段type=text,只有當輸入是6位數字時才應該設置爲有效。

{ 
    "name": "6-digit code", 
    "type": "text", 
    "pattern": "/^\d{6}$/" 
} 

在JavaScript中,源文本"/^\d{6}$/"產生相同的字符串作爲"/^d{6}$/"恰好。由於\d不是一個定義的轉義序列,因此它只是在d之前進行轉義。在JavaScript中,如果一個角色不需要轉義,但無論如何你都逃脫了,這個轉義就被忽略了。 (在使用JSON,這是嚴格,會抱怨文本上方對比度)

因此,在端點上的正則表達式定義如下:

String regex = "/^\\d{6}$/"; 

這意味着無論是製造JSON是這樣做不正確的,因爲如果它被正確地這樣做,d之前的反斜槓會逃脫和對象的源文本應該是這樣的:

{ 
    "name": "6-digit code", 
    "type": "text", 
    "pattern": "/^\\d{6}$/" 
} 

...可以正確使用RegExp構造函數一次(如squint在現在刪除的註釋中指出的那樣),您可以刪除前導斜槓和尾部斜槓(否則,正則表達式會嘗試按字面匹配/)。

所以這裏的解決方法是解決任何產生不正確的JSON,理想情況下通過使用適當的JSON庫(GsonJacksonJackson,...)。

+0

錯誤來自我身邊。應該定義輸入字段的對象不是JSON,而是從對REST端點的調用中接收到的JavaScript對象。對不起;) – oyvindym

+1

@oyvindym:它實際上並不重要,根本問題仍然是,無論採取什麼樣的字符串regex =「/^\\ d {6} $ /」;',把它放在一個對象上作爲模式',然後將該對象從服務器發送到客戶端的做法不正確。在JavaScript中,源文本「/^\ d {6} $ /」'完全**定義**與/「d {6} $ /」'相同的字符串,因爲與JSON不同,JavaScript是寬鬆的,if你轉義一個不需要轉義的字符(並且結果不是一個定義的轉義序列),轉義被忽略,只是使用字符。 –

+0

@ T.J.Crowder好的。感謝您的解釋。 – oyvindym

相關問題