我需要在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相同的一组角色?
答案 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