我想验证一个数字最大长度为13、小数点为2的货币字符串。我用逗号作为十进制分隔符,用句点作为千位分隔符。
我有一个正则表达式:
/^(\d{1}\.)?(\d+\.?)+(,\d{2})?$/
For sintax有效,但不适用于最大长度。我需要在这个正则表达式中添加什么?
例如,这些字符串必须有效:
1.000.000.000.000
1.000.000.000.000,00
1
1,00
123,45
这些必须是无效的:
10.000.000.000.000
10.000.000.000.000,00
10.000.000.000.000.000
10.000.000.000.000.000,00
90%的时候有比使用正则表达式更好的解决方案。最好将字符串转换为实数,然后与您的限制进行比较(即9999999999999.99
)。
// Pass a string
function convertStr(string) {
/*
Remove all '.'
Replace all ',' with '.'
*/
let numStr = string.split('.').join('').replaceAll(',', '.');
// Convert modified string into a real number
let realNum = parseFloat(numStr);
/*
if converted string is a real number...
round it to two decimal places and return it
Otherwise return false
*/
return !Number.isNaN(realNum) ? Math.round((realNum + Number.EPSILON) * 100) / 100 : false;
}
// Pass a string and the maxed number
function numLimit(string, limit) {
// Get the result of convertString()
let number = convertStr(string);
// if the result is equal to or less than limit...
if (number <= limit) {
return true;
} else {
return false;
}
}
const limit = 9999999999999.99;
const valid = ['1.000.000.000.000',
'1.000.000.000.000,00', '1', '1,00', '123,45'
];
const invalid = ['10.000.000.000.000', '10.000.000.000.000,00', '10.000.000.000.000.000', '10.000.000.000.000.000,00'];
let validResults = valid.map(str => numLimit(str, limit));
let invalidResults = invalid.map(str => numLimit(str, limit));
console.log('valid: ' + validResults);
console.log('invalid: ' + invalidResults);
您可以使用此正则表达式进行验证:
^(?=[\d.]{1,17}(?:,\d{2})?$)\d{1,3}(?:\.\d{3})*(?:,\d{2})?$
正则表达式演示
正则表达式详细信息:
^
:开始(? =[\d.]{1,17}(?:,\d{2})? $)
:预览匹配点或数字1到17次,后跟可选逗号和2位数字\d{1,3}
:匹配1到3位数字(?:\.\d{3})*
:匹配。
后跟3位数字。重复此组0次或更多次(?:,\d{2})?
:匹配可选的,
后跟2个十进制数字$
:结束可能尝试使用负前瞻性断言位置后面没有18位/点:
^(?![\d.]{18})\d{1,3}(?:\.\d{3})*(?:,\d\d?)?$
请参阅在线演示。这里假设您也允许一位数十进制。
^
-打开线锚
我不确定这是否可以使用正则表达式。我会尝试使用正则表达式,但如果不可能,我会切换到双重验证。 我的数据库(postgresql)接受为15,6(最多15位,最多6位小数),因此如果我有10位整数,我可以有5位小数。小数分隔符被忽略。 我目前有一个正则表达式(逗号是小数分隔符): 它不验证总长度,只验证左侧的数字。但由于用户也可以键入点(千位分隔符),我有一个怪物:
我正在尝试构建一个正则表达式,它接受具有以下条件的域名: 允许DNS名称(仅允许连字符、句点和字母数字字符)最多255个字符 连字符只能出现在字母之间 应该以字母开头,以字母结尾。它至少有3个字符(字母和句点必填,连字符可选)。 周期前标签的长度应为63 可能的情况: a、 b.c a-a.b 不该通过的案子 a-b q wert q wert q wert q wert q wert q wer
问题内容: 我一直认为,Java的regex-API(以及与此相关的许多其他语言)中的后置断言必须具有明显的长度。因此,STAR和PLUS量词在内部回顾中是不允许的。 优秀的在线资源regular-expressions.info似乎证实了我的一些假设: “ […] Java通过允许有限重复而向前迈进了一步。你仍然不能使用星号或加号,但是可以使用问号和花括号以及指定的max参数。Java认识到有限
我有一个正则表达式,最多允许6个小数(“.”是小数分隔符) 我还想设置最大长度条件,以便用户只能输入12位数字,最大长度应排除“.”我如何使用正则表达式做到这一点。
我需要根据给定条件验证输入, -总长度必须为20个字符-前五个位置必须是字母-剩余的应该是数字,但必须存在一个连字符(-),该连字符只能出现在数字之间。我喜欢正则表达式 但它也允许在结尾使用连字符,甚至可以不使用连字符。
我在寻找一个正则表达式,它允许数字具有小数点后的最大长度。 它应该允许最大16位数字和3位小数,但是最大16位应该包括小数,但不包括。字符。到目前为止,我已经尝试过了:,除了允许17个单个数字之外,它很接近,而它应该只接受16个。如果我将更改为,它会破坏小数。 可接受值: 123 123.3 123.45 123.456 1111111111111.345(共16个数字) 111111111111