正则表达式为“111 - > c:\ my source \ file1.cpp(无代码)”(C#)

时间:2011-05-03 15:14:19

标签: c# regex

我需要在C#中解析带有以下内容的字符串:

111 -> c:\my source\file1.cpp (no code)
112 -> c:\my source\file1.cpp
113 -> c:\my source\file2.cpp
114 -> c:\my source\file3.cpp
115 -> c:\my source\file2.cpp (no code)

我需要获取第一个数字和文件名,但仅限于包含代码的记录(因此最后不应该有(无代码))。 目前我最终得到了这个rexex

new Regex(@"^(\d+) -> ([^\r\n]*)", RegexOptions.Multiline | RegexOptions.IgnoreCase)

这很简单,但它给了我一些我不想看的线条。 我写^(\d+) -> ([^\r\n]*)(?! \(no code\))之类的所有尝试都失败了。 实际上,这可能是一个更通用的例子。喜欢: 如何在“aaa BBB ccc”的字符串中匹配 BBB ,其中BBB可以是任何一组字符,aaa和ccc是已知的标记,包括与BBB相同的一组角色?

2 个答案:

答案 0 :(得分:4)

为什么你不能使用:

^(\d+) -> ([\w:\\\s.]+)$

应用多行并且不允许(no code),因为它不包含在最后一个组中(在最后一个组的类中不允许使用括号)

<强> demo

如果您确实需要在文件名中允许括号,则可以使用以下内容:

^(\d+) -> (.+?)(?<! \(no code\))$

它使用负面的后视(因此你可以确保它不会在行尾之前出现)。

<强> demo

答案 1 :(得分:0)

我用c#对它进行了测试,它对我起作用了。

new Regex(@"^(\d+)\s->\s(.+\.\w+)(?!.*\(no code\))$", RegexOptions.Multiline | RegexOptions.IgnoreCase);

与你的尝试并没有什么不同,

^(\d+) -> ([^\r\n]*)(?! \(no code\))

但我认为您的中间部分([^\r\n]*)匹配得太多,因此负向前瞻不再匹配。

更新

我测试了@Brad Christie的解决方案

new Regex(@"^(\d+) -> (.+?)(?<! \(no code\))$", RegexOptions.Multiline | RegexOptions.IgnoreCase);

它在我的环境中也使用.net / c#,所以+1