如何编写Regex来从字符串中提取两位都为零的小数



我有以下字符串:

  • 您从这里收到$10.00
  • 您以10.00卢比的价格购买了0.00400 BCH
  • 您获得了10.00美元的退款
  • 您得到一张15.00美元的礼品卡

我想写一个正则表达式,它将从这些字符串中提取金额(小数点严格为2位,两位都有0,即粗体值(,但不应该提取0.00400。我尝试了这个正则表达式:"[0-9]\d{0,9}(\.\d{0,2})(?<!/{1,9}(\s)?)"。但是,这并不是适用于所有情况。此外,它还包括来自0.004000.00,这不是我想要的。那么,有人能帮助我如何编辑这个模式以满足我的要求吗?非常感谢。

让我们把它分解一下。

[0-9]\d{0,9}

这是一种奇怪的\d{1,9}编写方式。[0-9]是"unicode值介于0的unicode值和9的unicode价值之间的任何字符,\d是"任何数字",归根结底是一样的(\d在技术上支持非阿拉伯数字,但通常对这些数字持开放态度是个好主意。无论如何,无论你想要[0-9]{1,9}还是\d{1,9},而不是你写的,这都是混搭,听起来很疯狂。

(\.\d{0,2})

一个点,后跟0、1或2位数字。你说你想要两位数字,所以这应该是\.\d{2}

(?<!/{1,9}(\s)?)

一些负面的背后推波助澜-绝对没有理由卷入其中。我们不要全都用。

让我们重新开始,这感觉就像你走错了路。

你想要一个点,然后是2个零。就这样。让我们。。那么:

"(\d+)\.00(?!\d)"

这是:1个或多个数字,后面紧跟着一个点,然后是两个零(我们不提取,因为为什么要提取一个常数?(,然后我们不在乎,只要那里没有数字。

让我们运行它:

private static final Pattern p = Pattern.compile("(\d+)\.00(?!\d)");
public static void tryFind(String in) {
Matcher m = p.matcher(in);
System.out.print(in);
while (m.find()) System.out.print("  FOUND: " + m.group(1));
System.out.println("  END.");
}
public static void main(String[] args) {
tryFind("You received $10.00 from here");
tryFind("You purchased 0.00400 BCH for Rs.10.00");
tryFind("You got a refund of 10.00 USD");
tryFind("You got a gift card of 15.00USD and 20.00");
tryFind("Your point balance is 10.0000");
tryFind("Your next appointment is at 10.00.00 hours");
}

生产:

You received $10.00 from here  FOUND: 10  END.
You purchased 0.00400 BCH for Rs.10.00  FOUND: 10  END.
You got a refund of 10.00 USD  FOUND: 10  END.
You got a gift card of 15.00USD and 20.00  FOUND: 15  FOUND: 20  END.
Your point balance is 10.0000  END.
Your next appointment is at 10.00.00 hours  FOUND: 10  END.

这就是你想要的(注意这个约会的例子,它表明你想要的实际上并不是你想要的(。

最新更新