【问题标题】:Constructing RegExp in JavaScript from object property (string)从对象属性(字符串)在 JavaScript 中构造 RegExp
【发布时间】:2016-11-11 13:16:32
【问题描述】:

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

【问题讨论】:

    标签: javascript java angularjs regex


    【解决方案1】:

    下面的对象应该产生一个带有type=text 的输入字段,并且只有当输入是一个 6 位数字时才应该设置为有效。

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

    在 JavaScript 中,源文本 "/^\d{6}$/" 生成 完全"/^d{6}$/" 相同的字符串。由于\d 不是定义的转义序列,它只是d,前面有一个转义。在 JavaScript 中,如果一个字符不需要转义,但您还是将其转义,则转义将被忽略。 (与 JSON 相比,JSON 很严格,会抱怨上面的文字。)

    所以在端点,Regex 定义如下:

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

    这意味着生成 JSON 的任何东西都执行不正确,因为如果正确执行,d 之前的反斜杠将被转义,对象的源文本将如下所示:

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

    ...一旦您删除前导和尾随斜杠(否则,正则表达式将尝试匹配 / 字面上)。

    所以这里的解决方法是修复产生不正确 JSON 的任何东西,最好使用适当的 JSON 库(GsonJackson、...)。

    【讨论】:

    • 我的错误。应该定义输入字段的对象不是 JSON,而是从调用 REST 端点接收到的 JavaScript 对象。对不起;)
    • @oyvindym:实际上并不重要,根本问题仍然是,无论采用String regex = "/^\\d{6}$/";,将其放在pattern 的对象上,然后将该对象从服务器发送到客户端这样做不正确。在 JavaScript 中,源文本 "/^\d{6}$/" 定义 exactly"/^d{6}$/" 相同的字符串,因为与 JSON 不同,JavaScript 是宽松的,如果您转义不需要转义的字符(结果是' t 定义的转义序列),转义被忽略,只使用字符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多