从对象属性构造JavaScript中的RegExp(字符串)

时间:2016-11-11 13:16:33

标签: javascript java angularjs regex

我正在尝试在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}$/")在端点处声明正则表达式的情况下实现吗?

1 个答案:

答案 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库(GsonJackson,...)。