【发布时间】:2015-01-29 20:21:10
【问题描述】:
我有一个包含以下值的字符串列表:
"/manufacturers/244/rz-xvxcv/images/swed"
"/manufacturers/23/rz-gf/images/sltn"
"/manufacturers/34/rz-dffdf/images/five"
"/manufacturers/23/rz-gfgf/images/lead"
"/manufacturers/322/rz-dfg/images/carr"
"/manufacturers/3789/rz-fgdfgfg/images/zing"
我需要提取属于模式/manufacturers/[int]/rz- 的数字值的不同列表
所以在上面的例子中,我的新列表将包含:244,23,34,322,3789
这可以使用 RegEx 和 Linq 完成吗?
【问题讨论】:
-
现在看,您需要一个正则表达式来执行此操作。如果它们都相同,只需使用
@"\d+"。如果他们不是,并且需要获得资格,您将不得不使用@"^/manufacturers/(\d+)/rz-"。这是仅有的两个选择。你能做的最糟糕的事情就是在/上分裂,这是没用的。 -
@sln 如果 OP 需要验证他们是否以“/manufacturers/”开头,那么他们可以在
Where中使用StartsWith。仍然不需要正则表达式。我看不出在/上分裂是最糟糕的事情。 -
@juharr - 在这种情况下拆分 resilts 被用于位置假设数组元素是一个数字。仍然不能验证序列
/manufacturers/\d+/rz-。你知道也许它可以在拆分后得到验证,但是为什么不直接使用正则表达式呢? -
@sln 再次,OP 可以添加检查以确保路径的第二部分是数字。
paths.Where(p=>p.StartsWith("/manufacturers/")).Select(p=>p.Split('/')[2]).Where(d=>d.All(char.IsNumber)).Select(d=>int.Parse(d))。现在在这一点上,使用正则表达式的代码会更少,但性能不会更高,所以它只取决于哪个更重要。 -
@juharr - 是的,我猜。但我愿意打赌
@"^/manufacturers/(\d+)/rz-"更高效且更易于维护。 .