2012-01-24 19 views
1

我是非常新的正则表达式,无法让我的头完全缠绕它。如何从字符串中提取以逗号分隔的数字

我想写两个正则表达式的 - 你需要告诉我,如果他们甚至可能。两者都基于VB.net语法。

正则表达式1: 字符串我测试反对 - 在磁盘上 大小:25754900936个字节

它拥有领先的空间屈指可数,但文本始终是相同的。我试图提取出这个数字(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 

我只需要在最后一行(25705262230)的总字节数。是否有可能在多行搜索中做到这一点?相同的交易 - 文字总是相同的。

回答

2

关于第一个正则表达式来只提取号码,试试这个:

(\d+,?)+ 

它将匹配的一个或多个数字(0-9)组,任选随后发生一个逗号(,?)或更多次。

为了您的多行字符串,如果你知道该字符串将始终处于“字节”结束了,试试这个:

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

这将再次匹配类似于第一个正则表达式,虽然行必须结束“字节'为$表示行结束。然后你需要提取捕捉值:

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

James - 两个都确实有效,但我实际上并没有在.net中使用它 - 我使用的是可以执行regex的第三方应用程序。不幸的是,它只能用于第一个捕获,第一组。在第二个正则表达式中的任何方式来获得它的位置?现在它仍然有第一组的字节字第一次捕捉,但否则它是完美的。 – Pat

+0

@Pat啊我没有看到任何担忧。你需要添加一个积极的向前看,这样字符串的末尾(你不希望捕获的'字节')将不会被包含。我已经修改了上面的第二个正则表达式。让我知道如果这是有效的 - 我简单地通过使用'regex.Match([你的字符串])提取匹配的值(不带'字节')。值# –

+0

完美 - 谢谢! – Pat

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 - 寻找一个数字字符
    • + - ...嗯,OK,找​​到一个或更多的人
  • , - 后面跟一个文字逗号
    • ? - ...好吧,也许;没关系,如果你不能找到其中的一个
  • (?:…) - 现在,拿这一切,把它作为我们并不需要保存
    • +一组 - 允许该组发生任意次数
  • (…) - 捕捉所有这一切的结果,并将其保存为我
  • 噢,并确保所有的在此之前,你可以找到的文本右"Size on disk: "

在多行上,将您的正则表达式锚定到输入的末尾。同样,这里的JavaScript的一个例子:

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

你可以看到它在这里的行动:http://jsfiddle.net/uFfsc/1/

它是由你来学习如何锚你的正则表达式在.NET中的输入端。

+0

Phrogz - 感谢您的解释。上面的James的正则表达式运行良好,不幸的是(我没有提及它),我使用的是第三方应用程序,它只接受正则表达式。这不是一种编程语言,我可以添加JavaScript等等。但是你的解释很棒,帮助我更好地理解正则表达式的做法。 – Pat

+0

好的补充与非捕获括号,所以没有创建一个回参考:) –

+0

@Pat很高兴有帮助。 – Phrogz

相关问题