我有一些像这样的字符串:
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; =)在表达式结束时不起作用?据我所知,它假设在括号中找到表达式的一部分并忽略它,就像在表达式的第一部分中那样,但它并没有......
答案 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+)"