我的正则expression式匹配得太多了。 我如何使它停止?

J0000000: Transaction A0001401 started on 8/22/2008 9:49:29 AM J0000010: Project name: E:\foo.pf J0000011: Job name: MBiek Direct Mail Test J0000100: Machine name: DEV J0000100: Project file: E:\mbiek\foo.pf J0000100: Template file: E:\mbiek\foot.xdt J0000100: Job name: MBiek J0000100: Output folder: E:\foo\A0001401 J0000100: Temp folder: E:\foo\Output\A0001401 J0000100: Document 1 - Starting document J0005000: Document 1 - Text overflowed on page 1 (warning) J0000101: Document 1 - 1 page(s) composed J0000102: Document 1 - 1 page(s) rendered at 500 x 647 pixels J0000100: Document 1 - Completed successfully J0000020: 

我有这个巨大的丑陋的string,我正在使用正则expression式从它提取件。

在这种情况下,我想抓住“项目名称”之后的所有内容,直到“J0000011:”这一部分(每次11将会是不同的数字)。

这是我一直在玩的正则expression式

 Project name:\s+(.*)\s+J[0-9]{7}: 

问题是它不会停止,直到它到达J0000020:最后。

如何在J [0-9] {7}的第一次出现时使正则expression式停止?

通过添加' .*非贪婪' ? “之后:

 Project name:\s+(.*?)\s+J[0-9]{7}: 

在这里使用非贪婪的量词可能是最好的解决scheme,也是因为它比贪婪的替代方法更有效率:贪婪的匹配通常会尽可能地(直到文本结尾!),然后追溯字符尝试匹配之后的部分。

霍尔,考虑使用负面的字符类,而不是:

 Project name:\s+(\S*)\s+J[0-9]{7}: 

\S意思是“除了空格之外的所有东西,这正是你想要的。

那么, ".*"是一个贪婪的select器。 你用".*?"使它变得非贪婪 当使用后一种构造时,正则expression式引擎将在每一步将文本匹配到"." 试图匹配".*?"之后的任何内容".*?" 。 这意味着,如果在".*?"之后没有任何内容出现, ,那么它什么都不匹配。

这是我用过的。 s包含你的原始string。 这个代码是.NET特定的,但是大多数正则expression式都有类似的东西。

 string m = Regex.Match(s, @"Project name: (?<name>.*?) J\d+").Groups["name"].Value; 

我还build议你使用“Expresso”实验正则expression式 – 这是一个实用程序,是一个伟大的(免费的)用于正则expression式编辑和testing的工具。

它的好处之一就是它的UI暴露了很多正则expression式的function,人们对这些正则expression式的使用可能并不熟悉,从而使他们很容易学习这些新的概念。

例如,当使用UI构build正则expression式,并select“*”时,即使您不熟悉,也可以选中“尽可能less”checkbox并查看生成的正则expression式,并testing其行为非贪婪的表情之前。

可以在他们的网站下载: http : //www.ultrapico.com/Expresso.htm

快速下载: http : //www.ultrapico.com/ExpressoDownload.htm