【问题标题】:Regex error in Typescript not matching dotTypescript 中的正则表达式错误与点不匹配
【发布时间】:2018-05-30 13:24:03
【问题描述】:

我正在使用这个正则表达式来验证输入字段是否只允许一个点和数字。 它与javascript完美配合。但是当它与打字稿一起使用时,它只接受数字并在匹配时为 dot(.) 提供 null。

这是我的正则表达式对象:

RegExp = new RegExp(/^[0-9]*\.?[0-9]*$/g)

这就是我使用它的方式。

@HostListener('keydown', [ '$event' ])
onKeyDown(event: KeyboardEvent) {
    if (this.specialKeys.indexOf(event.key) !== -1) {
        return;
    }
    let current: string = this.changeRate.nativeElement.value;
    let next: string = current.concat(event.key);
    console.log(next+" : "+String(next).match(this.regex)+" : " +event.key);
    if (next && !String(next).match(this.regex)) {
        event.preventDefault();
    }
}

【问题讨论】:

    标签: javascript regex typescript


    【解决方案1】:

    TypeScript 在这里并没有什么特别之处(毕竟 TypeScript 只是带有类型注释的 JavaScript)。引用自 MDN:RegEx

    有两种方法可以创建 RegExp 对象:文字符号和 构造函数。为了指示字符串,文字的参数 表示法不使用引号,而参数 构造函数使用引号。

    以下三个表达式创建相同的正则表达式:

    /ab+c/i;
    new RegExp('ab+c', 'i');
    new RegExp(/ab+c/, 'i');
    

    还有:

    使用构造函数时,正常的字符串转义规则 (当包含在字符串中时,前面带有 \ 的特殊字符)是 必要的。例如,以下是等价的:

    var re = /\w+/;
    var re = new RegExp('\\w+');
    

    但是,您的实际问题是,您似乎使用 Regex 类名作为变量名。否则,您的正则表达式定义很好。

    var regex = new RegExp(/^[0-9]*\.?[0-9]*$/g);
    const str = `1.1`;
    let m;
    
    while ((m = regex.exec(str)) !== null) {
        // This is necessary to avoid infinite loops with zero-width matches
        if (m.index === regex.lastIndex) {
            regex.lastIndex++;
        }
        
        // The result can be accessed through the `m`-variable.
        m.forEach((match, groupIndex) => {
            console.log(`Found match, group ${groupIndex}: ${match}`);
        });
    }

    【讨论】:

    • 同样的问题,它也只匹配数字。我还检查了可能导致此问题的任何其他功能。但这是与输入框关联的唯一事件。
    【解决方案2】:

    此语法错误:RegExp = new RegExp(/^[0-9]*\.?[0-9]*$/g)

    你要么写

    • this.regex = /^[0-9]*\.?[0-9]*$/g

    • this.regex = new RegExp("^[0-9]*\\.?[0-9]*$", "g")(在字符串中使用\\.以正确输出\.

    我假设 typescript 正在幕后尝试以第二种方式解析它,它正在转义 . 而不是字面上写 \.

    【讨论】:

    • 我为正则表达式对象做了 console.log,所以当我使用 \\.它打印 /^[0-9]*\.?[0-9]*$/g 和 \.它打印了这个 /^[0-9]*.?[0-9]*$/g 但在这两种情况下它都不会接受点,我也尝试了这两种语法。 (我之前将其声明为私有变量。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 2022-01-13
    相关资源
    最近更新 更多