2016-11-11 23 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

相关问题