正则表达的奇数钱价值

时间:2012-11-29 20:42:59

标签: java regex

我有一个包含奇数钱值的字符串。字符串是:

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+)\)?).*

它所吸引的群体是:

  1. 每日利息费用
  2. 901
  3. 9 259.18
  4. 190.07
  5. 分组3就是问题。它包含一个额外的数字,第一个9

    修改编辑

    有一个空间导致了这个问题,这样做了:

    (?:\$\s*\d*\.\d*\s)?

2 个答案:

答案 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位数。