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

A regex to get any price string

我需要从字符串中获取价格,但不需要其他数字。字符串可以说什么没有限制,但它总是有一个美元金额。这是我需要从字符串中获取的美元金额。

我能找到的最接近的解决方案是 \d{1,3}[,\.]?(\d{1,2})?

在像 "2 BED / 2 BATH for 0,000.00, what a deal!!!" 这样的示例字符串中,正则表达式应该只有 return ,000,000,而没有其他数字。上面的解决方案将 return 221,000,000.00。理想的解决方案不应匹配美元金额之外的任何数字。它还需要在匹配之前包含符号(以考虑所有货币符号(美元、英镑、欧元等)的可能性)。

因此,正则表达式匹配的价格应如下所示:0,000.00,但它也可以匹配 €40,000

你可以用这个

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

将任何货币符号插入第一组[$€]以匹配它们
并在线试用 here

此选项将匹配任何金额而不指定货币

\S+\d[\d,\.]*?\b

如果由于输入中的拼写错误而必须指定货币,那么您也可以使用以下正则表达式作为替代:

(?:\p{Sc}|ƒ)[\d,\.]+\b

注意:\p{Sc} 可以匹配任何货币符号。

正则表达式 '\S+\d[\d,\.]*?\b' 在用 Java 编写的测试台中进行了测试,以表明它可以处理任何金额和货币:

public static void main(String[] args) {

    List<String> inputs = Arrays.asList(
            "2 BED / 2 BATH for 0,000.00, what a deal!!!",
            " 2 BED / 2 BATH for 0,000.00, what a deal ",
            ".00 2 BED / 2 BATH for ,000.00, what a deal 0",
            "£40.00 2 BED / 2 BATH for ,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 0,000.00, what a deal!!!'
Extracted price string:
0,000.00
=======================
Line to match: ' 2 BED / 2 BATH for 0,000.00, what a deal '
Extracted price string:

0,000.00

=======================
Line to match: '.00 2 BED / 2 BATH for ,000.00, what a deal 0'
Extracted price string:
.00
,000.00
0
=======================
Line to match: '£40.00 2 BED / 2 BATH for ,000, what a deal €600.00'
Extracted price string:
£40.00
,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
=======================

Link到更多货币符号: https://en.wikipedia.org/wiki/Currency_sign_(typography)

如果要将数字前的所有货币符号与数字本身相匹配,可以组合这两个表达式:

  • Currency symbol regex: \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}ƒ]
  • Number regex: (?<!\d)(?<!\d\.)(?:\d{1,3}(?:,\d{3})*|\d+)(?:\.\d{1,2})?(?!\.?\d)

货币取自World Currency Symbols,模式中使用的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)

regex demo

它是这样创建的:(?:CUR_SYM_REGEX)\s?NUM_REGEX,由于已经定义了 left-hand 上下文,因此从模式中删除了数字正则表达式中的 lookbehinds。