0

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

Daily interest charges #901 $ 17.2789 259.18 190.07/day

奇数值是$ 17.2789

我正在尝试创建一个正则表达式,它将得到 is,但没有反向引用。这就是我想出的:

(?:\\$\\s*?\\d{0,1,2,3}\\.\\d{0,1,2,3,4}\\s*?/?day)?

然而,这不会编译。里面的一切对我来说似乎都是合理的?知道它可能有什么问题吗?我正在使用 Java

编辑

我已经尝试过 m.buettner 的建议\\$\\s*\\d*\\.\\d*。我把它放在下面的第三组中。这几乎可以做到。这是我的完整正则表达式:

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

问题在于第 3 组。它包含一个额外的数字,第一个9

编辑 编辑

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

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

4

2 回答 2

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完全省略。并考虑删除 external ?,也是。正如布赖恩在评论中所说,没有必要使\\s重复变得不贪婪,因为它和以下元素无论如何都是互斥的:

\\$\\s*\\d{0,3}\\.\\d{0,4}

如果值是“奇数”,你真的必须对位数如此具体吗?

\\$\\s*\\d*\\.\\d*
于 2012-11-29T20:44:30.957 回答
1

这种模式

"\\d+\\.\\d{3,}"

将匹配点后超过 2 个数字的每个数字。

于 2012-11-29T21:03:27.633 回答