我需要从字符串中获取价格,但不需要其他数字。该字符串可以表示的内容没有任何限制,但其中始终包含美元金额。这是我需要从字符串中获取的美元金额。
我能找到的最接近的解决方案是
\d{1,3}[,\\.]?(\\d{1,2})?
在像
"2 BED / 2 BATH for $120,000.00, what a deal!!!"
这样的示例字符串中,正则表达式应该只返回 $1,000,000
,而不返回其他数字。上述解决方案将返回 2
、2
和 1,000,000.00
。理想的解决方案不应匹配美元金额之外的任何数字。它还需要在比赛之前包含符号(以考虑所有货币符号(美元、英镑、欧元等)的可能性。
因此,正则表达式匹配的价格应如下所示:
$120,000.00
,但它也可以匹配类似 €40,000
的内容
如果要将数字前面的所有货币符号与数字本身匹配,可以组合两个表达式:
\b(?:[BS]/\.|R(?:D?\$|p))| \b(?:[TN]T|[CJZ])\$|Дин\.|\b(?:Bs|Ft|Gs|K[Mč]|Lek|B[Zr]|k[nr]|[PQLSR]|лв|ден|RM|MT|lei|zł|USD|GBP|EUR|JPY|CHF|SEK|DKK|NOK|SGD|HKD|AUD|TWD|NZD|CNY|KRW|INR|CAD|VEF|EGP|THB|IDR|PKR|MYR|PHP|MXN|VND|CZK|HUF|PLN|TRY|ZAR|ILS|ARS|CLP|BRL|RUB|QAR|AED|COP|PEN|CNH|KWD|SAR)\b|\$[Ub]|[\p{Sc}ƒ]
(?<!\d)(?<!\d\.)(?:\d{1,3}(?:,\d{3})*|\d+)(?:\.\d{1,2})?(?!\.?\d)
货币取自世界货币符号,模式中使用的3字母货币代码是最常用的,但也可以使用这些数据编制综合列表。
答案是
(?:\b(?:[BS]/\.|R(?:D?\$|p))|\b(?:[TN]T|[CJZ])\$|Дин\.|\b(?:Bs|Ft|Gs|K[Mč]|Lek|B[Zr]|k[nr]|[PQLSR]|лв|ден|RM|MT|lei|zł|USD|GBP|EUR|JPY|CHF|SEK|DKK|NOK|SGD|HKD|AUD|TWD|NZD|CNY|KRW|INR|CAD|VEF|EGP|THB|IDR|PKR|MYR|PHP|MXN|VND|CZK|HUF|PLN|TRY|ZAR|ILS|ARS|CLP|BRL|RUB|QAR|AED|COP|PEN|CNH|KWD|SAR)|\$[Ub]|[\p{Sc}ƒ])\s?(?:\d{1,3}(?:,\d{3})*|\d+)(?:\.\d{1,2})?(?!\.?\d)
查看正则表达式演示
它是这样创建的:
(?:CUR_SYM_REGEX)\s?NUM_REGEX
,由于左侧上下文已经定义,因此数字正则表达式中的lookbehinds从模式中剥离。
此替代方案将匹配任何金额,无需指定货币
\S+\d[\d,\.]*?\b
如果由于输入中的拼写错误而必须指定货币,那么您还可以使用以下正则表达式作为替代:
(?:\p{Sc}|ƒ)[\d,\.]+\\b
注意:\p{Sc} 可以匹配任何货币符号。
在用 Java 编写的测试平台中测试正则表达式 '\S+\d[\d,\.]*? ,以显示它可以处理任何金额和货币:
public static void main(String[] args) {
List<String> inputs = Arrays.asList(
"2 BED / 2 BATH for $120,000.00, what a deal!!!",
"$1 2 BED / 2 BATH for $120,000.00, what a deal $3",
"$1.00 2 BED / 2 BATH for $2,000.00, what a deal $300",
"£40.00 2 BED / 2 BATH for $50,000, what a deal €600.00",
"₧10 2 BED / 2 BATH for ƒ80.00, what a deal ₨9"
);
Pattern pattern = Pattern.compile("\\S+\\d[\\d,\\.]*?\\b");
for (String input : inputs) {
System.out.printf("Line to match: '%s'%n", input);
Matcher matcher = pattern.matcher(input);
System.out.println("Extracted price string:");
while(matcher.find()) {
System.out.println(matcher.group());
}
System.out.println("=======================");
}
}
输出:
Line to match: '2 BED / 2 BATH for $120,000.00, what a deal!!!'
Extracted price string:
$120,000.00
=======================
Line to match: '$1 2 BED / 2 BATH for $120,000.00, what a deal $3'
Extracted price string:
$1
$120,000.00
$3
=======================
Line to match: '$1.00 2 BED / 2 BATH for $2,000.00, what a deal $300'
Extracted price string:
$1.00
$2,000.00
$300
=======================
Line to match: '£40.00 2 BED / 2 BATH for $50,000, what a deal €600.00'
Extracted price string:
£40.00
$50,000
€600.00
=======================
Line to match: '₧10 2 BED / 2 BATH for ƒ80.00, what a deal ₨9'
Extracted price string:
₧10
ƒ80.00
₨9
=======================