首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >找到价格的正则表达式

找到价格的正则表达式
EN

Stack Overflow用户
提问于 2019-06-13 22:17:17
回答 3查看 97关注 0票数 1

正则表达式提取文本中的所有价格,其中价格将使用",“作为小数分隔符。没有数以千计的分离器,它们后面将是“UDS”。例如:

代码语言:javascript
运行
复制
1500 USD
9 USD
0,53 USD
12,01 USD
代码语言:javascript
运行
复制
^[^0]\d+(\,)?[0-9]{0,2} USD

它适用于:

代码语言:javascript
运行
复制
1500 USD
12,01 USD

但它不适用于:

代码语言:javascript
运行
复制
9 USD
0,53 USD
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-06-14 10:24:49

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

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

下面的部分(\,)?[0-9]{0,2}是一个可选的组,用于匹配逗号(注意不必转义)和0-2位数。这样,像1,这样的值也会匹配。

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

如果您希望整个匹配而不仅仅是价格,您可以匹配美元,而不是使用积极的展望。

代码语言:javascript
运行
复制
(?<!\S)\d+(?:,\d{1,2})?(?= USD\b)

Regex演示

另一种选择是使用捕获组而不是前瞻性。(?:^|\s)断言字符串的开始或匹配空格字符。

代码语言:javascript
运行
复制
(?:^|\s)(\d+(?:,\d{1,2})?) USD\b

Regex演示

票数 2
EN

Stack Overflow用户

发布于 2019-06-13 22:40:31

在JavaScript中

代码语言:javascript
运行
复制
/^\d{1,}(,\d{2}){0,1} USD$/

代码语言:javascript
运行
复制
    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'));

或在行动中:

代码语言:javascript
运行
复制
% 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启用扩展正则表达式

票数 2
EN

Stack Overflow用户

发布于 2019-06-13 22:25:08

我猜这个简单的表达式会返回我们想要的东西:

代码语言:javascript
运行
复制
([0-9,.]+)

不管我们可能拥有的其他文本内容,因为这里不需要验证,假设我们的价格是有效的。

演示1

RegEx电路

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

测试

代码语言:javascript
运行
复制
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);
        }
    }
}

演示

代码语言:javascript
运行
复制
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}`);
    });
}

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56589203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档