我有以下字符串:
- 您从这里收到$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.00400
的0.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.
这就是你想要的(注意这个约会的例子,它表明你想要的实际上并不是你想要的(。