在c#中构建正则表达式

时间:2014-10-23 21:38:36

标签: c# regex

我有一些像这样的字符串:

  

DEV_NUM_26 - 某些类型... TYPE0支持某些功能

我的目标是获取下一个数据:(id = 26,type = TYPE0)

表达式如下所示:

    (?<id>(?<=DEV_NUM_) \d{0,3}) \s-\s (?<name>(?<=Some \s type \.+) \w+)

但我得到0匹配结果,问题是第二个(?&lt; =)。如果我尝试做类似的事情:

    (?<id>(?<=DEV_NUM_) \d{0,3}) \s-\s (?<name>Some \s type \.+ \w+)

我得到了下一个结果:(id = 26,type = Some type ... TYPE0)

第一个也是主要的问题是如何修复这个表达式。最后但并非最不重要的是为什么排除前缀(?&lt; =)在表达式结束时不起作用?据我所知,它假设在括号中找到表达式的一部分并忽略它,就像在表达式的第一部分中那样,但它并没有......

1 个答案:

答案 0 :(得分:1)

相反,请将您不希望包含的部分放在指定的捕获组之外。 注意:我从你的表达式中删除了Positive Lookbehind断言,因为这里没有必要。

String s = "DEV_NUM_26 - Some type...TYPE0 with support of some functions";
Match m  = Regex.Match(s, @"DEV_NUM_(?<id>\d{0,3})\s-\sSome\stype\.+(?<name>\w+)");
if (m.Success)
    Console.WriteLine(m.Groups["id"].Value);   //=> "26"
    Console.WriteLine(m.Groups["name"].Value); //=> "TYPE0"

如果你想缩短你的表达,你可以把它写成......

@"(?x)DEV_NUM_ (?<id>\d+) [^.]+\.+ (?<name>\w+)"