用于匹配由“$”字符分隔的正非零双精度字符串的正则表达式
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数字”。为我分解它的奖励积分!以上是关于用于匹配由“$”字符分隔的正非零双精度字符串的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章