正则表达式用于仅允许空格和1个逗号或点的数字

时间:2019-04-25 11:32:36

标签: javascript regex

我正在努力使正则表达式符合以下条件:

  • 仅数字
  • 允许的空间(不间断和不间断),但不能超过一个连续的空间
  • 只允许使用一个逗号,或仅允许一个点.(不是两个)
  • 编辑:起始字符和结束字符应为数字或符号-(最大为1 -

这应匹配以下字符串: 45646544 454 845 484874584.4242 424 484.45874584,4242 424 484,45 ...

不匹配42a42.45,42 ...

我尝试将其扩展为^[0-9[,.!?]*$,但没有成功。

4 个答案:

答案 0 :(得分:2)

您可以使用字符类来匹配点或逗号,并在可选组中匹配后跟1个以上的数字:

^\d+(?:[,.]\d+)?(?: \d+(?:[,.]\d+)?)*$

这将匹配

  • ^字符串的开头
  • \d+(?:[,.]\d+)?将1个以上的数字与一个可选部分匹配,以匹配点号或逗号后跟1个以上的数字
  • (?: \d+(?:[,.]\d+)?)*将前面的部分重复0+次,并在开头加上一个空格
  • $字符串的结尾

Regex demo

更新

如果字符串只能包含单个点或逗号:

^(?!(?:[^.,\n]*[.,]){2})\d+(?:[,.]\d+)?(?:[^\S\n\r]\d+(?:[,.]\d+)?)*$
  • ^字符串的开头
  • (?!(?:[^.,\n]*[.,]){2})负向查找,断言右边的内容不是点或逗号的2倍
  • \d+(?:[,.]\d+)?匹配1个以上的数字,可以选择匹配点或逗号和1个以上的数字
  • (?:非捕获组
    • [^\S\n\r] Negated character class,不匹配非空格字符,不匹配换行符
    • \d+(?:[,.]\d+)?匹配1个以上的数字,可以选择匹配点或逗号和1个以上的数字
    • )*关闭非捕获组并重复0次以上
  • $字符串的结尾

Regex demo

let regex = /^(?!(?:[^.,\n]*[.,]){2})\d+(?:[,.]\d+)?(?:[^\S\n\r]\d+(?:[,.]\d+)?)*$/;
[
  "424242424",
  "424242.424",
  "454545.58",
  "4545454,4545",
  "45454,45",
  "4 45 44454.45",
  "4 454 454,45",
  "1 2 3",
  "1 2 3",
  "4,2 424 484,45 34.4 3 4",
  "545g45",
  "454.454.45",
  "45454,454,45",
  "45.44,45",
  "45,45.45",
  "4 4545 4545 45  45",
].forEach(s => console.log(s + ": " + regex.test(s)))

答案 1 :(得分:1)

您可以使用此正则表达式,

^(?=^[\d ]+[,.]?[\d ]+$)\d+(?:[ .,]\d+)*$

(?=^[\d ]+[,.]?[\d ]+$)在这里积极的前瞻性保证了\d+(?:[ .,]\d+)*只会处理一个逗号或点,而df1 = df.T dfs = {c: df1[[c]] for c in df1.columns} print (dfs) {0: 0 col1 1 col2 2 col3 3, 1: 1 col1 4 col2 5 col3 6} 会照顾格式和允许的字符。

Regex Demo

答案 2 :(得分:0)

先输入数字或空格:

^[0-9 ]*

然后,逗号或点:

(\.|,)?

然后,再输入一些数字和/或空格,以及表达式的结尾:

[0-9 ]*$

一起:

^[0-9 ]*(.|,)?[0-9 ]*$

答案 3 :(得分:0)

使用此^(\d*? ?\d)+(,|\.)?\d+$

测试用例https://regex101.com/r/DDdvf3/4