如何从字符串中提取逗号分隔的数字

时间:2012-01-24 02:03:18

标签: .net regex vb.net extract

我对正则表达式非常陌生,并且无法让我的头完全缠绕它。

我正在尝试写两个正则表达式 - 你需要告诉我他们是否可能。两者都基于VB.net语法。

正则表达式1: 我正在测试的字符串 -     磁盘大小:25,754,900,936字节

它有一些前导空格,但文字总是一样的。我试图提取出数字(25,754,900,936)。

我尝试了一些正则表达式,但我无法将所有内容都放在一行上。逗号搞砸了我并返回多个匹配(例如,\ d + \ W +给了我四个匹配,每个匹配用逗号分隔一组。)

我所做的最好的是[0-9 /,] *但是这给了我25个空匹配和一个匹配(在匹配19上)的数字。我需要这个匹配比赛1.

可行?看到一个正则表达式,我可以从字符串中提取这样的数字将非常有用。

正则表达式2:
同样的想法,但现在多线。

我正在测试的字符串 -

           0 File(s)              0 bytes
           1 File(s)         11,546 bytes
           1 File(s)        259,584 bytes
           3 File(s)          5,682 bytes
       17218 File(s) 25,705,262,230 bytes

我需要最后一行(25,705,262,230)的总字节数。是否可以在多行搜索中执行此操作?同样的交易 - 文本总是一样的。

2 个答案:

答案 0 :(得分:2)

对于你的第一个正则表达式只提取数字,试试这个:

(\d+,?)+

它将匹配一个或多个数字(0-9)的组,可选地后跟逗号(,?),这些组会出现一次或多次。

对于您的多行字符串,如果您知道该字符串将始终以'bytes'结尾,请尝试以下操作:

(\d+,?)+(?=\s*bytes$)

这将再次匹配类似于第一个正则表达式,尽管该行必须以“字节”结尾,因为$表示该行的结尾。然后,您需要提取捕获的值:

'Regex is your regular expression object containing the second regex
regex.Match([your string]).Value

答案 1 :(得分:0)

要提取数字,请使用以下正则表达式:

/Size on disk: ((?:\d+,?)+)/

然后提取第一个捕获的组。在JavaScript中:

var s = "Size on disk: 25,754,900,936 bytes";
var bytes = s.match(/Size on disk: ((?:\d+,?)+)/)[1];
// "25,754,900,936"

正则表达式(从内到外)

  • \d - 找一个数字字符
    • + - 好吧,好的,找到其中一个或多个
  • , - 后跟一个字面逗号
    • ? - ......好吧,也许;如果你找不到其中一个
    • ,那没关系
  • (?:…) - 现在,把所有这些都当作一个我们不需要保存的小组来对待
    • + - 允许该群体多次发生
  • (…) - 捕获所有结果并将其保存给我
  • 哦,是的,并确保在所有这一切之前你可以找到文本"Size on disk: "

在多行上,将正则表达式锚定到输入的末尾。再次,这是JavaScript中的一个示例:

var re = /((?:\d+,?)+) bytes$/m;
var total = multiline.match(re)[1];

您可以在此处看到它:http://jsfiddle.net/uFfsc/1/

由您来学习如何将.NET中的正则表达式锚定到输入的末尾。