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]*)?$