我有一个包含奇数钱值的字符串。字符串是:
Daily interest charges #901 $ 17.2789 259.18 190.07/day
奇数值为$ 17.2789
我正在尝试创建一个将获得的正则表达式,但没有后向引用。这就是我想出的:
(?:\\$\\s*?\\d{0,1,2,3}\\.\\d{0,1,2,3,4}\\s*?/?day)?
然而,这不会编译。那里的一切对我来说似乎都合理吗?知道它可能有什么问题吗?我正在使用Java
修改
我已经尝试了\\$\\s*\\d*\\.\\d*
的m.buettner建议。我将它放在下面的第3组中。这差不多了。这是我完整的正则表达式:
(.*)\s?#(\s?\d{3,4})\s*(?:\$\s*\d*\.\d*)?((?:-|\()?\$?(?:\d{1,3}[ ,]?)*(?:\.\d+)\)?)\s*((?:-|\()?\$?(?:\d{1,3}[ ,]?)*(?:\.\d+)\)?).*
它所吸引的群体是:
分组3就是问题。它包含一个额外的数字,第一个9
修改编辑
有一个空间导致了这个问题,这样做了:
(?:\$\s*\d*\.\d*\s)?
答案 0 :(得分:3)
据我所知\\d{0,1,2,3...}
是无效的语法。你的意思可能是:
(?:\\$\\s*?\\d{0,3}\\.\\d{0,4}\\s*?/?day)?
另外,您是否知道您的整个模式是可选的?这带来了一个问题。 \\d{0,3}\\.\\d{0,4}
只会匹配第一个(奇数)数字。然后你有一个可选的斜杠,但是强制day
(如果没有删除整个模式)。但是在输入字符串中,遇到/day
之前还有一些其他数字。因此,即使它编译,也不会与您的价格值相匹配。您应该完全忽略\\s*?/?day
。并考虑删除外部?
。正如布莱恩在评论中所说的那样,没有必要不加重复\\s
重复,因为它和以下元素无论如何都是相互排斥的:
\\$\\s*\\d{0,3}\\.\\d{0,4}
如果值为“奇数”,你真的必须对数字这么具体吗?
\\$\\s*\\d*\\.\\d*
答案 1 :(得分:1)
此模式
"\\d+\\.\\d{3,}"
将匹配点后的每个数字超过2位数。