我正在尝试在Angular中创建一个可以从远程端点配置的输入指令。
下面的对象应该会产生一个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}$/
这可以在没有使用四组斜杠(即"/^\\\\d{6}$/"
)在端点处声明正则表达式的情况下实现吗?
答案 0 :(得分:3)
下面的对象应该会产生一个
type=text
的输入字段,并且只有在输入为6位数的情况下才应设置为有效。{ "name": "6-digit code", "type": "text", "pattern": "/^\d{6}$/" }
在JavaScript中,源文本"/^\d{6}$/"
生成与<{1}}完全相同的字符串。由于"/^d{6}$/"
不是定义的转义序列,因此它只是\d
,并且前面有一个转义符。在JavaScript中,如果角色不需要转义但无论如何都要逃避它,那么转义就会被忽略。 (与JSON相比,这是严格的,会抱怨上面的文字。)
因此,在端点处,正则表达式定义如下:
d
这意味着生成JSON的任何内容都是错误的,因为如果它正确地执行了这样做,String regex = "/^\\d{6}$/";
之前的反斜杠将被转义,并且对象的源文本将如下所示:
d
...可以正常使用{
"name": "6-digit code",
"type": "text",
"pattern": "/^\\d{6}$/"
}
构造函数(在现在删除的注释中指出squint)你删除了前导和尾部斜杠(否则,正则表达式将尝试匹配RegExp
字面意思)。
所以这里的解决方法是修复产生错误JSON的所有问题,理想情况是使用适当的JSON库(Gson,Jackson,...)。