Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 数字、小数和分数的正则表达式_Javascript_Regex - Fatal编程技术网

Javascript 数字、小数和分数的正则表达式

Javascript 数字、小数和分数的正则表达式,javascript,regex,Javascript,Regex,如何创建允许整数、小数、分数和带小数的分数的正则表达式? 字符串也可以有可选文本,仅在末尾。 到目前为止,我有: const re = /^\d*\.?\d*\/?\d*\.?\d*[a-z]*$/gi; 这允许在整数中使用双小数(即:“23.23.23”),这是我不想要的。我是否可以修改此正则表达式,使其仅在用“/”分隔时才允许使用两个小数点 以下是一些可以通过的示例: 23.23/100公里 1/3 .23公里 1.4英里 1.2/2.1kg 一些不应该通过的示例: 1A3公里 12

如何创建允许整数、小数、分数和带小数的分数的正则表达式? 字符串也可以有可选文本,仅在末尾。 到目前为止,我有:

const re = /^\d*\.?\d*\/?\d*\.?\d*[a-z]*$/gi;
这允许在整数中使用双小数(即:“23.23.23”),这是我不想要的。我是否可以修改此正则表达式,使其仅在用“/”分隔时才允许使用两个小数点

以下是一些可以通过的示例:

  • 23.23/100公里
  • 1/3
  • .23公里
  • 1.4英里
  • 1.2/2.1kg
一些不应该通过的示例:

  • 1A3公里
  • 12.12.12
  • 1.2.3/12.13公里
  • 12公里/12.44公里
使用

^(?。.*\d+(?:\.\d+{2})\d*\.?\d*\/?\d*\.?\d*.[a-z]*$
看。由于
(?!.*\d+(?:\。\d+{2})
负前瞻,此表达式不允许三个相互之间有句点的数字

解释

--------------------------------------------------------------------------------
^字符串的开头
--------------------------------------------------------------------------------
(?!向前看,看看是否有:
--------------------------------------------------------------------------------
.*除\n(0次或多次)以外的任何字符
(匹配尽可能多的金额)
--------------------------------------------------------------------------------
\d+数字(0-9)(1次或多次(匹配
尽可能多的钱)
--------------------------------------------------------------------------------
(?:组,但不捕获(2次):
--------------------------------------------------------------------------------
\.                       '.'
--------------------------------------------------------------------------------
\d+数字(0-9)(1次或多次
(匹配尽可能多的金额)
--------------------------------------------------------------------------------
){2} 分组结束
--------------------------------------------------------------------------------
)展望的结束
--------------------------------------------------------------------------------
\d*数字(0-9)(0或更多次(匹配
尽可能多的钱)
--------------------------------------------------------------------------------
\.?                      '.' (可选)(与最大金额匹配)
(可能的)
--------------------------------------------------------------------------------
\d*数字(0-9)(0或更多次(匹配
尽可能多的钱)
--------------------------------------------------------------------------------
\/?                      '/' (可选)(与最大金额匹配)
(可能的)
--------------------------------------------------------------------------------
\d*数字(0-9)(0或更多次(匹配
尽可能多的钱)
--------------------------------------------------------------------------------
\.?                      '.' (可选)(与最大金额匹配)
(可能的)
--------------------------------------------------------------------------------
\d*数字(0-9)(0或更多次(匹配
尽可能多的钱)
--------------------------------------------------------------------------------
[a-z]*从'a'到'z'(0或更多)的任何字符
次数(匹配尽可能多的数量))
--------------------------------------------------------------------------------
$在可选的前\n和
一串
这应该行得通

^[0-9]*(?:\.[0-9]*)?(?:\/[0-9]*(?:\.[0-9]*)?)?[a-zA-Z]*$

您尝试的模式由所有可选部分组成,因为所有量词要么是
表示可选,要么是
*
表示0次或更多次。由于
/
也是可选的,因此您将匹配
12.12.12

您可以使带有
/
部件的部件成为可选部件,而不必使
/
本身成为可选部件

如果您希望至少匹配一个数字并防止匹配空字符串,则可以使用正向前瞻来匹配至少一个数字

^(?=[^\d\r\n]*\d)\d*\.?\d*(?:\/\d*\.?\d*)?[a-z]*$

模式匹配

  • ^
    字符串的开头
  • (?=[^\d\r\n]*\d)
    至少声明一个数字
  • \d*\.?\d*
    匹配可选数字和
  • (?:
    非捕获组
    • \/\d*\.?\d*
      匹配
      /
      和可选数字和
  • )?
    关闭非捕获组并将其设置为可选
  • [a-z]*
    可选择匹配字符a-z
  • $
    字符串结尾

如果
/
的每一侧至少有一个数字不匹配,例如
/

^(?:\d*\.?\d+|\d+\.)(?:\/\d*\.?\d+|\d+\.)?[a-z]*$
模式匹配

  • ^
    字符串的开头
  • (?:\d*\。?\d+\d+\)
    匹配可选数字、可选
    和1+数字或匹配1+数字和
  • (?:
    非捕获组
    • \/\d*\?\d+\d+\.
      匹配
      /
      ,并再次与第一个模式相同
  • )?
    关闭非捕获组并将其设置为可选
  • [a-z]*
    可选择匹配字符a-z
  • $
    字符串结尾

如果数据不正确,是否应该允许数字和单位之间有空格