gpt4 book ai didi

javascript - 从对象属性(字符串)在 JavaScript 中构造 RegExp

转载 作者:行者123 更新时间:2023-11-29 04:37:45 25 4
gpt4 key购买 nike

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

最佳答案

The object below should result in a input-field with type=text and should only be set to valid if the input is a 6-digit number.

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

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

So at the endpoint the Regex is defined as follows:

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

这意味着生成 JSON 的任何东西都是错误的,因为如果它正确地这样做,d 之前的反斜杠将被转义,对象的源文本将如下所示:

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

...将与 RegExp 构造函数一起正确工作一次(如 squint 在现已删除的评论中指出的那样)您删除前导和尾随斜杠(否则,正则表达式将尝试按字面匹配 /)。

因此,这里的解决方法是修复生成不正确 JSON 的任何内容,最好是使用适当的 JSON 库(GsonJackson、...)。

关于javascript - 从对象属性(字符串)在 JavaScript 中构造 RegExp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40548851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com