Javascript 正则表达式不在指令中工作-Angular 4

Javascript 正则表达式不在指令中工作-Angular 4,javascript,regex,angular,Javascript,Regex,Angular,我创建了一个指令来验证用户在文本字段中输入的内容。用户可以输入数字、点和逗号,但不能输入任何其他内容 验证器在输入数字时工作,但我不能输入逗号和点 import { Directive, ElementRef, HostListener } from '@angular/core'; @Directive({ selector: '[appInputValidator]' }) export class InputValidatorDirective { private regex: R

我创建了一个指令来验证用户在文本字段中输入的内容。用户可以输入数字、点和逗号,但不能输入任何其他内容

验证器在输入数字时工作,但我不能输入逗号和点

import { Directive, ElementRef, HostListener } from '@angular/core';

@Directive({
  selector: '[appInputValidator]'
})
export class InputValidatorDirective {

private regex: RegExp = new RegExp(/^[0-9]{1,2}([,.][0-9]{1,2})?$/);

// Allow key codes for special events
// Backspace, tab, end, home
private specialKeys: Array<string> = ['Backspace', 'Tab', 'End', 'Home'];

constructor(private el: ElementRef) {
}

@HostListener('keydown', ['$event'])
onKeyDown(event: KeyboardEvent) {
    debugger
    // Allow Backspace, tab, end, and home keys
    if (this.specialKeys.indexOf(event.key) !== -1) {
        return;
    }

    let current: string = this.el.nativeElement.value;
    let next: string = current.concat(event.key);
    if (next && !String(next).match(this.regex)) {
        event.preventDefault();
    }
}
从'@angular/core'导入{Directive,ElementRef,HostListener};
@指示({
选择器:“[appInputValidator]”
})
导出类InputValidator指令{
私有regex:RegExp=newregexp(/^[0-9]{1,2}([,.][0-9]{1,2})$/);
//允许特殊事件的关键代码
//退格、制表符、结束、起始
private specialKeys:Array=['Backspace','Tab','End','Home'];
构造函数(专用el:ElementRef){
}
@HostListener('keydown',['$event']))
onKeyDown(事件:KeyboardEvent){
调试器
//允许使用退格键、制表符键、结束键和主控键
if(this.specialKeys.indexOf(event.key)!=-1){
返回;
}
让当前值:string=this.el.nativeElement.value;
let next:string=current.concat(event.key);
if(next&&!String(next).match(this.regex)){
event.preventDefault();
}
}
}

我已经在线测试了正则表达式,它可以处理数字、点和逗号,但在应用程序中我不能输入点或逗号。怎么了?

您可以使用

private regex: RegExp = /^[0-9]{1,2}([,.][0-9]{0,2})?$/;
                                               ^

请注意,
{0,2}
量词使
[0-9]
匹配零位、一位或两位数字,因此
2.
类值将不再阻止用户键入带有小数部分的数字。

因为当您输入
12.
时,它使用错误的函数(match)与regexAm I不匹配?是否可以限制输入,以使逗号和点不能作为第一个字符?否。由于您每次按一个键时都要进行检查,因此当用户想要输入“12.3”时,在第三个键的笔划上,字符串将变为
12。
,这使正则表达式检查失败。解决方案是允许用户输入任何内容,并在焦点离开输入后进行验证,或者根据输入,您可以创建一个正则表达式,允许中间状态扫描正则表达式,以便逗号和点不能成为字符串中的第一个字符?Try
private regex:RegExp=/^[0-9]{1,2}([,.][0-9]{0,2})$/