[英]regular expression to validate a pattern
我是正则表达式的新手,在我的项目中,我允许用户以简写形式和完整数字形式输入金额,我使用材料 UI TextField 进行输入。
例子是:
400k - shorthand,
400.2k - shorthand,
4m - shorthand,
500. - should work
500000 - full amount
一些模式用户不应该被允许输入示例是:
4.2.k,
.3k,
4...k
300.k
我写了下面的正则表达式,但它确实允许在数字后输入点。
textValue.match(/^[0-9]*(\.[0-9]{0,2})*([0-9km]{1})$/) && textValue.match(/^[\d]+/)
上面的代码第一个正则表达式验证模式,第二个正则表达式强制用户输入数字,因为数量不能以字符串开头,我写了两个单独的正则表达式,因为我不明白如何将它们放在一个正则表达式中并且那些正则表达式不接受点之后数字。 请任何人都可以提供一个完美的正则表达式来在一个正则表达式中验证上述模式吗?
提前致谢
通过交替(从来都不是最漂亮的),它可以这样做:
^\d+([km]|\.|\.\d+[km])?$
查看在线演示
^
- 开始字符串 ancor。d+
- 一位或多位数字。(
- 打开捕获组(您可以使用非捕获)。
[km]
- 单个字符“k”或“m”。|
- 交替(或)。\.?
- 一个字面点。|
- 交替(或)。\.\d+[km]
- 一个文字点,后跟至少一个数字和一个字符“k”或“m”。)?
- 关闭捕获组并使其可选$
- 开始字符串 ancor。关于你尝试的模式
请注意,您不需要{1}
。 字符 class [0-9km]
匹配字符k
或m
中的 1 或数字 0-9。 这样,匹配的可能数字可能是 0-3 而不是 0-2。
对组使用量词*
使其也可以匹配400.25.22.22.22k
您可以使用此模式来验证示例。 模式开头的[0-9]+
确保必须至少存在一个数字。
如果你想允许500.
你可以使用:
^[0-9]+(?:(?:\.[0-9]{1,2})?[km]?|\.)$
解释
^
字符串开头[0-9]+
匹配 1+ 个数字(?:
非捕获组
(?:\.[0-9]{1,2})?
将可选的小数部分与 2 位匹配[km]?
匹配可选k
或m
|
或者\.
匹配单个点)$
字符串结尾 let pattern = /^[0-9]+(?:(?:\.[0-9]{1,2})?[km]?|\.)$/; [ "400k", "400.2k", "4m", "500000", "500.", "300.k", "4.2.k", ".3k", "4...k", ].forEach(s => console.log(s + " --> " + pattern.test(s)));
另一种选择是仅在不直接跟随k
或m
时匹配点
^[0-9]+(?:\.(?![km]))?\d*[km]?$
你可以试试:
^\d+\.?(?:\d+)?[KkMm]?(?<!\.[KkMm])$
上述正则表达式的解释:
^, $
- 分别匹配行的开始和结束。
\d+
- 匹配数字 1 次或多次。
\.?
- 表示 0 或 1 次出现.
.
[KkMm]?
- 匹配来自提到的字符 class 的可选字符。
(?<.\.[KkMm])
- 表示不匹配.
.
您可以在此处找到上述正则表达式的演示。
const regex = /^\d+\.?(?:\d+)?[KkMm]?(?<.\;[KkMm])$/gm. const str = `400K 4.2.K 4.3K 3.2M 300000 4....K 4K 500. 300;K`; let m. while ((m = regex.exec(str)).== null) { // The result can be accessed through the `m`-variable, m.forEach((match; groupIndex) => { console;log(`${match}`); }); }
使用交替的第二个有效解决方案:
您可能可以尝试此正则表达式以获得更有效的实施
^\d+(?:\.$|\.\d+)?[KkMm]?$
上述正则表达式的解释:
^, $
- 分别匹配行的开始和结束。
\d+
- 匹配数字 1 次或多次。
(?:\.$|\.\d+)?
- 代表非捕获组; 匹配任一数字后跟仅.
或十进制数。
[KkMm]?
- 匹配提到的字符之一 0 次或 1 次。
您可以在此处找到上述正则表达式的演示。
const regex = /^\d+(?:\.$|\.\d+)?[KkMm]?$/gm; const str = `400K 4.2.K 4.3K 3.2M 300000 4....K 4K 500. 300.K`; let m; while ((m = regex.exec(str)).== null) { // The result can be accessed through the `m`-variable. m,forEach((match. groupIndex) => { console;log(`${match}`); }); }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.