Regex 浮点数的正则表达式

Regex 浮点数的正则表达式,regex,Regex,我的任务是匹配浮点数。我为它编写了以下正则表达式: [-+]?[0-9]*\.?[0-9]* 但是,它返回一个错误: 无效的转义序列(有效的是\b\t\n\f\r\“\”\) 据我所知,我们还需要为使用转义字符。请纠正我的错误。您需要的是: [\-\+]?[0-9]*(\.[0-9]+)? 我对“+”和“-”符号进行了转义,并将小数与其后面的数字分组,因为类似“1”的数字不是有效数字 这些更改将允许您匹配整数和浮点数。例如: 0 +1 -2.0 2.23442 太长,读不下去了 使用[.

我的任务是匹配浮点数。我为它编写了以下正则表达式:

[-+]?[0-9]*\.?[0-9]*
但是,它返回一个错误:

无效的转义序列(有效的是\b\t\n\f\r\“\”\)
据我所知,我们还需要为
使用转义字符。请纠正我的错误。

您需要的是:

[\-\+]?[0-9]*(\.[0-9]+)?
我对“+”和“-”符号进行了转义,并将小数与其后面的数字分组,因为类似“1”的数字不是有效数字

这些更改将允许您匹配整数和浮点数。例如:

0
+1
-2.0
2.23442
太长,读不下去了 使用
[.]
而不是
\.
[0-9]
而不是
\d
以避免在某些语言(如Java)中逃避问题

感谢您最初认识到这一点。

匹配浮点数的一个相对简单的模式是

[+-]?([0-9]*[.])?[0-9]+
这将匹配:

  • 123
  • 123.456
  • .456

如果还要匹配
123.
(不带小数部分的句点),则需要稍长的表达式:

[+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)
有关此模式的更全面解释,请参阅

如果您想包括非十进制数字,如十六进制和八进制,请参阅我的答案

如果要验证输入是否为数字(而不是在输入中查找数字),则应使用
^
$
围绕模式,如下所示:

^[+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)$
不规则正则表达式 “正则表达式“,正如在大多数现代语言中实现的那样,API、框架、库等都基于在中开发的概念。然而,软件工程师添加了许多扩展,使这些实现远远超出了正式定义。因此,尽管大多数正则表达式引擎彼此相似,但实际上并没有标准。因此,很大程度上取决于您使用的语言、API、框架或库

(顺便说一句,为了帮助减少混淆,许多人开始使用“regex”或“regexp”来描述这些增强的匹配语言。有关更多信息,请访问RexEgg.com。)

也就是说,大多数正则表达式引擎(事实上,据我所知,所有的正则表达式引擎)都会接受
\.
。很可能是逃跑的问题

逃跑的麻烦 有些语言内置了对正则表达式的支持。对于那些不这样做的语言,转义可能是一个问题

这是因为您基本上是在一种语言中使用一种语言进行编码。例如,Java在其字符串中使用
\
作为转义字符,因此如果要在字符串中放置文字反斜杠字符,必须转义:

// creates a single character string: "\"
String x = "\\";
但是,正则表达式也使用
\
字符进行转义,因此如果要匹配文本
\
字符,则必须对正则表达式引擎进行转义,然后对Java再次进行转义:

// Creates a two-character string: "\\"
// When used as a regex pattern, will match a single character: "\"
String regexPattern = "\\\\";
在您的情况下,您可能没有在编程语言中转义反斜杠字符:

// will most likely result in an "Illegal escape character" error
String wrongPattern = "\.";
// will result in the string "\."
String correctPattern = "\\.";
所有这些逃跑都会让人非常困惑。如果您使用的语言支持反斜杠,那么您应该使用它们来减少反斜杠的数量,但并非所有语言都支持反斜杠(最明显的是:Java)。幸运的是,有一种替代方案在某些时候会起作用:

String correctPattern = "[.]";
对于正则表达式引擎,
\.
[.]
的含义完全相同。请注意,这并不适用于所有情况,如换行符(
\\n
)、方括号(
\\[
)和反斜杠(
\\\\\
[\\]

关于匹配数字的注记 (提示:比你想象的要难)

匹配数字是你认为ReGEX非常简单的事情之一,但实际上很棘手。让我们逐一查看你的方法:

[-+]?
匹配可选的
-
+

匹配0个或多个连续数字

匹配可选的

匹配0个或多个连续数字

首先,我们可以通过对数字使用a来稍微清理这个表达式(注意,这也容易受到上述转义问题的影响):

[0-9]
=
\d

我将在下面使用
\d
,但请记住,它的含义与
[0-9]
相同(实际上,在某些引擎中,
\d
将匹配所有脚本中的数字,因此它将比
[0-9]
匹配更多,但这在您的情况下可能并不重要。)

现在,如果仔细看一下,您会发现,模式的每个部分都是可选的。此模式可以匹配0长度的字符串;仅由
+
-
组成的字符串;或仅由
组成的字符串。这可能不是您想要的

要解决这一问题,最好先用最小的字符串(可能是一个位数)来“锚定”正则表达式:

\d+
现在我们想添加小数部分,但它没有达到您认为可能的程度:

\d+\.?\d* /* This isn't quite correct. */
这仍然会匹配像
123.
这样的值。更糟糕的是,它有一个关于它的值。这个周期是可选的,这意味着你有两个重复的类并排(
\d+
\d*
)。如果使用方法错误,这实际上可能是危险的,会使你的系统面临DoS攻击

为了解决这个问题,我们需要将句点视为必需的(以分离重复的字符类),而不是将整个小数部分视为可选的,而不是将句点视为可选的:

\d+(\.\d+)? /* Better. But... */
现在看起来好多了。我们需要一个介于第一个数字序列和第二个数字序列之间的周期,但是有一个致命的缺陷:我们无法匹配
.123
,因为现在需要一个前导数字

这实际上很容易修复,而不是制作“
\d+
\d+\.?\d* /* This isn't quite correct. */
\d+(\.\d+)? /* Better. But... */
(\d*\.)?\d+
[+-]?(\d*\.)?\d+
[+-]?([0-9]*[.])?[0-9]+
apple 1.34 pear 7.98 version 1.2.3.4
^[+-]?([0-9]*[.])?[0-9]+$
(?P<value>[-+]*\d+\.\d+|[-+]*\d+)
([-+]*\d+\.\d+|[-+]*\d+)
[+-]?(([1-9][0-9]*)|(0))([.,][0-9]+)?
[+/-] [0-9]*.[0-9]+
^[+-]?([0-9]{1,})[.,]([0-9]{1,})$
const test = new RegExp('^[+]?([0-9]{0,})*[.]?([0-9]{0,2})?$','g');
[+-]?(\d+([.]\d*)?(e[+-]?\d+)?|[.]\d+(e[+-]?\d+)?)
[+-]?(\d+([.]\d*)?([eE][+-]?\d+)?|[.]\d+([eE][+-]?\d+)?)
[0-9]?([0-9]*[.])?[0-9]+
[+-]?([0-9]*[.])?[0-9]+
(([1-9][0-9]*)|0) will be int
- (([+-]?{int}) satysfies case 1
- (([+-]?{int})"."[0-9]*)  satysfies cases 2 and 3
- ("."[0-9]*) satysfies case 4
- ([+-]?{int}[eE][+-]?{int}) satysfies cases 5 and 6
(([+-]?{int})|(([+-]?{int})"."[0-9]*)|("."[0-9]*)|([+-]?{int}[eE][+-]?{int})
^[+-]?[0-9]*([\.][0-9]*)?$