Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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
Java 为什么正则表达式不能正常工作?_Java_Regex - Fatal编程技术网

Java 为什么正则表达式不能正常工作?

Java 为什么正则表达式不能正常工作?,java,regex,Java,Regex,我试图解决leetcode上的问题。对于这个问题,我选择的语言是Java 如果您不想访问该网站,请参阅问题说明 问题陈述 一个有效的数字可以按顺序分为以下几部分: 十进制数或整数 可选输入一个“e”或“e”,后跟一个整数 十进制数可以按顺序分为以下几部分: 可选符号字符“+”或“-” 以下格式之一: 至少一个数字,后跟一个点“.” 至少一个数字,后跟一个点“.”,后跟至少一个数字 一个点“.”,后跟至少一个数字 整数可以按顺序拆分为以下组件: 可选符号字符“+”或“-” 至少一个数字 例如,以下

我试图解决leetcode上的问题。对于这个问题,我选择的语言是Java

如果您不想访问该网站,请参阅问题说明

问题陈述 一个有效的数字可以按顺序分为以下几部分:

十进制数或整数

可选输入一个“e”或“e”,后跟一个整数

十进制数可以按顺序分为以下几部分:

可选符号字符“+”或“-”

以下格式之一:

至少一个数字,后跟一个点“.”

至少一个数字,后跟一个点“.”,后跟至少一个数字

一个点“.”,后跟至少一个数字

整数可以按顺序拆分为以下组件:

可选符号字符“+”或“-”

至少一个数字

例如,以下所有数字均为有效数字:

[20089、-0.1、+3.14、4、-0.9、2e10、-90E3、3e+7、+6e-1、53.5e93、-123.456e789]

以下数字无效:

[abc,1a,1e,e3,99e2.5,-6,-+3955E53]

给定字符串s,如果s是有效数字,则返回true

我的方法 我尝试将给定字符串与以下正则表达式匹配

\\+|-?\\d*\.\\d+\\d[eE]

我在Javascript中分析了整个正则表达式。当我对照输入检查它时,它在Javascript中运行良好。我只是简单地转义了转义字符\以使正则表达式在Java中工作

Javascript中的正则表达式:-/\+\124;-?\ d*\.\d+\d[eE]?/g

以下是全部代码:-

类解决方案{ 公共布尔值isNumberString s{ 字符串正则表达式=\\+\\124;-?\\ d*\.\\d+\\\d[eE]?; 返回s.matchesregex; } } 但它给了我错误的答案。有人能帮忙吗

我想了解为什么这个正则表达式的Java版本不起作用


我可以查看leetcode讨论部分来找到答案,但我想解释一下正则表达式的Java版本到底出了什么问题。

不要使用正则表达式来解决它。尝试使用DoubleparseDouble解析字符串,如果解析失败,则声明该字符串不表示数字

演示:

输出:


请注意,NaN、无穷大、0xap0等也是有效数字。检查以了解更多信息。

不要使用正则表达式来解决此问题。尝试使用DoubleparseDouble解析字符串,如果解析失败,则声明该字符串不表示数字

演示:

输出:

请注意,NaN、无穷大、0xap0等也是有效数字。检查以了解更多信息。

因为3e+7必须匹配,但[eE]之后没有任何内容您的正则表达式看起来有误

以下正则表达式通过所有给定测试:

String regex = "^(\\+|\\-)?(\\d+\\.\\d*|\\d*\\.\\d+|\\d+)([eE](\\+|\\-)?\\d+)?$";
我们可以这样理解:

^必须一开始就匹配。 \\+|\\-? 可能有+或-。 小数点1 |小数点2 |整数也就是说,数字点和可能更多的数字,可能是数字点和数字,只有数字。 10指数?可能指数,其中10指数是e,后跟可能符号和整数。 不多了。 因为3e+7必须匹配,但[eE]之后没有任何内容,您的正则表达式看起来是错误的

以下正则表达式通过所有给定测试:

String regex = "^(\\+|\\-)?(\\d+\\.\\d*|\\d*\\.\\d+|\\d+)([eE](\\+|\\-)?\\d+)?$";
我们可以这样理解:

^必须一开始就匹配。 \\+|\\-? 可能有+或-。 小数点1 |小数点2 |整数也就是说,数字点和可能更多的数字,可能是数字点和数字,只有数字。 10指数?可能指数,其中10指数是e,后跟可能符号和整数。 不多了。
您确定JS中有/\+\124;-?\ d*\.\d+\d[eE]?/g吗?\+|部分错误,必须用括号括起来。另一点:您的JS正则表达式是/../g,匹配字符串中任意位置的模式的多个实例,而在Java中,您使用的是.matches,这是一种需要完整字符串单个匹配的方法。我怀疑这是唯一真正的问题:您需要在循环中使用Matcherfind来获取所有匹配项。我在Java版本中添加了括号,但在JS中,我没有括号,因此工作正常。感谢您指出/../g。这些默认情况下存在于Regexr网站中。抱歉,但是\+\124;-?\ d*\。\d+\d[eE]?在任何方面都不行。它匹配+字符或可选-,然后匹配零位或更多位+。+一个或多个数字或单个数字,然后是E或E。您说您需要可选的符号字符+或-。-那就是[-+]?。因此,您实际上没有在JavaScript中使用正则表达式,只是在带有JS选项集的在线正则表达式测试仪上使用。您需要在[eE]字符集后强制使用1个或多个数字。您确定JS中有/\+\124;-?\ d*\。\d+\d[eE]?/g吗?\+|部分错误,必须用括号括起来。另一点:您的JS正则表达式是/../g,匹配字符串中任意位置的模式的多个实例,而在Java中,您使用的是.matches,这是一种需要完整字符串单个匹配的方法。我怀疑这是唯一真正的问题:您需要在循环中使用Matcherfind来
获取所有匹配项。我在Java版本中添加了括号,但在JS中,我没有括号,而且工作正常。感谢您指出/../g。这些默认情况下存在于Regexr网站中。抱歉,但是\+\124;-?\ d*\。\d+\d[eE]?在任何方面都不行。它匹配+字符或可选-,然后匹配零位或更多位+。+一个或多个数字或单个数字,然后是E或E。您说您需要可选的符号字符+或-。-那就是[-+]?。因此,您实际上并没有在JavaScript中使用正则表达式,只是在带有JS选项集的在线正则表达式测试仪上使用。您需要在[eE]字符集后强制使用1个或更多数字。它工作正常。但我其实不需要逃避这个角色,对吧?尽管如此,当我以v/s的方式转义时,代码在前一个场景中运行得快了一点。你能解释一下吗?@VIVEKJAIN当它被转义时,它被视为普通字符,如果不是,则必须在编译正则表达式时执行一个小的回溯。如果您预编译正则表达式模式。编译^\\+\124;-?\\ d+\.\\d*\\\\d*\.\\d+\124\\\\ d+[eE]\\+\124;-?\\ d+?$,差异消失。它工作正常。但我其实不需要逃避这个角色,对吧?尽管如此,当我以v/s的方式转义时,代码在前一个场景中运行得快了一点。你能解释一下吗?@VIVEKJAIN当它被转义时,它被视为普通字符,如果不是,则必须在编译正则表达式时执行一个小的回溯。如果您预编译正则表达式模式。compile ^\\+\124;-?\\ d+\.\\d*\\\\d*\.\\d+\124\\\ d+[eE]\\+\124;-?\\ d+?$,那么差异就消失了。您能否进一步了解DoubleparseDuble方法的内部工作,并解释为什么NaN,Infinity和0xap0也会被接受?@VIVEKJAIN-我已经更新了我的答案,添加了Java规范中描述它的部分的链接。Java语言规范不是DoubleparseDouble的规范-尽管该方法是兼容的。你能进一步说明DoubleparseDuble的内部工作吗方法,并解释为什么NaN、Infinity和0xap0也会被接受?@VIVEKJAIN-我更新了我的答案,添加了Java规范中描述它的部分的链接。Java语言规范不是DoubleparseDouble的规范,尽管该方法是兼容的。
String regex = "^(\\+|\\-)?(\\d+\\.\\d*|\\d*\\.\\d+|\\d+)([eE](\\+|\\-)?\\d+)?$";