获取任何价格字符串的正则表达式

问题描述 投票:0回答:3

我需要从字符串中获取价格,但不需要其他数字。该字符串可以表示的内容没有任何限制,但其中始终包含美元金额。这是我需要从字符串中获取的美元金额。

我能找到的最接近的解决方案是

\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

的内容
regex
3个回答
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)\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从模式中剥离。


2
投票

此替代方案将匹配任何金额,无需指定货币

\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
=======================

更多货币符号链接: https://en.wikipedia.org/wiki/Currency_sign_(排版)


1
投票

你可以用这个

[$€]{1}(?P<amount>[\d,\.]+(?>\.\d{2}){0,})\b

将任何货币符号插入第一组

[$€]
以匹配它们
并在线尝试这里

© www.soinside.com 2019 - 2024. All rights reserved.