查找价格的正则表达式

时间:2019-06-13 22:17:17

标签: regex

正则表达式可提取文本中的所有价格,其中价格将使用“,”作为小数点分隔符。没有成千上万的分隔符,后跟“ UDS”。例如:

1500 USD
9 USD
0,53 USD
12,01 USD

^[^0]\d+(\,)?[0-9]{0,2} USD

它适用于:

1500 USD
12,01 USD

但不适用于:

9 USD
0,53 USD

3 个答案:

答案 0 :(得分:2)

在JavaScript中

/^\d{1,}(,\d{2}){0,1} USD$/

    var regex = /^\d{1,}(,\d{2}){0,1} USD$/;
    // true result
    console.log(regex.test('9 USD'));
    console.log(regex.test('0,53 USD'));
    console.log(regex.test('12,01 USD'));
    console.log(regex.test('1500 USD'));
    // false result
    console.log(regex.test(' USD'));
    console.log(regex.test('0,5,3 USD'));
    console.log(regex.test('12,0124 USD'));
    console.log(regex.test('1s500 USD'));

或执行操作

% echo "1500 USD 9 USD 0,53 USD 12,01 USD" |sed  -E 's/[0-9]+(,[0-9][0-9]){0,1} USD/TRUE/g'
TRUE TRUE TRUE TRUE

选项-E启用扩展的正则表达式

答案 1 :(得分:2)

在您的模式^[^0]\d+(\,)?[0-9]{0,2} USD的这一部分^[^0]中,第一个^是表示字符串开头的锚点。

第二个^位于字符类的开头,其含义不同。它创建一个否定的字符类,表示它不能以0开头。

以下部分(\,)?[0-9]{0,2}是一个可选组,用于匹配逗号(请注意,您不必对其进行转义)和0-2位数字。这样,1,之类的值也将匹配。

没有标记语言,但是如果支持正向查找和负向查找,则可以使用此模式使用单词边界提取文本中的价格,以防止数字和USD成为较大单词的一部分。 (?<!\S)断言直接在左边的不是非空格字符。

如果您想要整个匹配而不是仅价格,则可以匹配USD而不是使用正向超前。

(?<!\S)\d+(?:,\d{1,2})?(?= USD\b)

Regex demo

另一种选择是使用捕获组而不是先行记录。 (?:^|\s)声明字符串的开头或匹配空白字符。

(?:^|\s)(\d+(?:,\d{1,2})?) USD\b

Regex demo

答案 2 :(得分:-1)

我的猜测是,这个简单的表达式将返回我们可能想要的:

([0-9,.]+)

无论我们可能拥有其他文本内容如何,​​因为此处假定我们的价格有效,因此在此不需要验证。

Demo 1

RegEx电路

jex.im可视化正则表达式:

enter image description here

测试

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"([0-9,.]+)";
        string input = @"500 USD 9 USD 0,53 USD 12,01 USD
1500 USD 12,01 USD 9 USD 0,53 USD  1500 USD 12,01 USD 9 USD 0,53 USD ";
        RegexOptions options = RegexOptions.Multiline;

        foreach (Match m in Regex.Matches(input, pattern, options))
        {
            Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
        }
    }
}

演示

const regex = /([0-9,.]+)/gm;
const str = `500 USD 9 USD 0,53 USD 12,01 USD
1500 USD 12,01 USD 9 USD 0,53 USD  1500 USD 12,01 USD 9 USD 0,53 USD `;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}