我的正则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