用于匹配由“$”字符分隔的正非零双精度字符串的正则表达式

Posted

技术标签:

【中文标题】用于匹配由“$”字符分隔的正非零双精度字符串的正则表达式【英文标题】:Regex for matching a string of positive non-zero doubles seperated by the "$" character 【发布时间】:2017-05-06 12:14:39 【问题描述】:

上下文:我找到了匹配三个由“$”字符分隔的整数的解决方案,如下所示:

String toMatch = "123$53$12"; //Returns true
String toMatch2 = "123$0$12"; //Returns false
String toMatch3 = "0$53$12";  //Returns false
String toMatch4 = "123$53$0"; //Returns false
System.out.println(toMatch.matches("\\d+.*\\d+.*\\d+") && !toMatch.matches([^0-9]*0[^0-9]*"));

问题:我想要实现的是:

String toMatch = "123.43$.03$123.0"; //Returns true
String toMatch2 = "123$000000$12";   //Returns false
String toMatch3 = "0.0000$53$12";    //Returns false
String toMatch4 = "123$53$.000";     //Returns false

基本上我想要的是一个匹配由“$”字符分隔的 3 个数字的正则表达式,如果通过 Double.parseDouble() 方法解析,每个数字都是一个正非零双精度数。

【问题讨论】:

为什么123$000000$12 不应该匹配? 因为数字 0 包含在字符串中。 我刚刚找到了一个半解决方案,我将更新主帖。这不是我正在寻求的解决方案。 所以如果我能理解你的字符串应该是这样的ints point ints dollar point ints dollar ints point ints ? @AlexPapageorgiou 我无法关注你。你愿意还是不接受0?您必须更准确地提出问题。 【参考方案1】:

如果我理解正确,我认为这会起作用:

^(?!\\$)((^|\\$)(?=[^$]*[1-9])(\\d+(\\.\\d*)?|(\\.\\d*)?\\d+))3$

遵循一个解释:

^(?!\\$): 比赛开始后不能跟'$' 3: 以下模式必须重复 3 次 (^|\\$):模式以字符串开头或以“$”开头(不是两者,如上所述) (?=[^$]*[1-9]): 在下一个最终的 '$' 之前必须有一个非 0 数字 (\\d+(\\.\\d*)?|(\\.\\d*)?\\d+):号码的允许格式为\d+(\.\d*)?(\.\d*)?\d+ $:结束

请参阅here 以获取演示

扩展表达式(如果您不相信重复技巧)是:

^(?=[^$]*[1-9])(\\d+(\\.\\d*)?|(\\.\\d*)?\\d+)\\$(?=[^$]*[1-9])(\\d+(\\.\\d*)?|(\\.\\d*)?\\d+)\\$(?=[^$]*[1-9])(\\d+(\\.\\d*)?|(\\.\\d*)?\\d+)$

【讨论】:

哇,非常感谢@horcrux,这正是我想要的。我无法弄清楚如何写的部分是“在最终的'$'之前必须有一个非0数字”。为我分解它的奖励积分!

以上是关于用于匹配由“$”字符分隔的正非零双精度字符串的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

常见的正则匹配

php正则表达式基本

java 正则表达式匹配字符串,包含没有数字的单词,并且可以选择用逗号分隔

可以告诉我给定语言的正则表达式吗?

RegEx 用于匹配除逗号分隔的数字之外的所有字符

用于逗号分隔文本的 Mysql 正则表达式