字符串替换为正则表达式十进制验证在Javascript中失败

时间:2017-07-19 09:58:51

标签: javascript regex ecmascript-6 onkeyup key-events

我尝试使用正则表达式使用string.replace限制用户输入。但它失败了,它不允许输入任何角色。请参阅以下HTML页面。

<!DOCTYPE html>
<html>
<head>
	<title>Decimal Validation</title>
</head>
<body>
<p>A function is triggered when the user is pressing a key and on keyup in the input field.</p>

<input type="text" maxlength="9" onkeyup="myFunction(this)">

<script>

function myFunction(text) {
	if(text) {
    	text.value = text.value.replace(/^(\d{0,4}\.\d{0,5}|\d{0,9}|\.\d{0,8})/g, '');
	}
}

</script>
</body>
</html>

我只需要允许数字和精度(即只允许一个点)。如果用户输入只是整数,则长度应为9 ,或者如果输入仅为小数部分,则允许最大8精度,或者如果混合然后允许{{ 1}} - 允许4位数和5位精度。

上面说的正则表达式无法验证,只允许char数字和一个句点。

1 个答案:

答案 0 :(得分:2)

验证和替换是两个不同的任务,您需要先测试字段,然后再测试最终的字段。例如:

function myFunction(text) {
    if( !/^(\d{0,4}\.\d{0,5}|\d{0,9}|\.\d{0,8})$/.test(text.value) ) {
        text.value = ''; // or an other kind of replacement if you need something
                         // more precise
    }
}

请注意,您也可以像这样重写模式:

/^(?!\d*\.\d*\.)[\d.]{0,9}$/

要将字符保留在验证模式的开头,您可以使用此替换:

text.value = text.value.replace(/^(\d{0,4}\.\d{0,5}|\d{0,9}|\.\d{0,8}).*/, '$1');