2011-06-06 74 views
1

我想获取familyId,并且在compar/produ.aspx之间有一个替代方案。我使用正则表达式:c#正则表达式 - 替代文字

\ /选择器/ (。COMPAR + |机生产线+)的.aspx \ famiid = (\ d {2}) \ &机生产线= \ d {2}

匹配: /selector/comparioPage.aspx?famiid=32 &机生产线= 40 和 /selector/productCust.aspx?famiid=32 &机生产线= 40

,我得到FAMILYID作为第二场比赛。

其实我必须使用()来使可能的替代(比较或产品)。问题是我不想在比赛组中获得compario或产品。

但是如果我删除(),正则表达式的行为有所不同:/选择/不选择:(

我怎样才能摆脱()和仅获得FAMILYID

的一部分吗?由于

回答

3

您可以使用此语法指定non-capturing group访问:(?:...)

所以你的模式成为(?:compar.+|produ.+)

,为什么你不使用全名目前尚不清楚除非其他页面具有相同的前缀。如果是一个更好的模式可能是:

@"/selector/(?:compar|produ)[^.]+\.aspx\?famiid=(\d+)&produ=\d+"; 

通过使用[^.]+它将匹配除了一个时期的一切。另外,为什么要将数字限制为两位?如果有一个或多个呢? \d+更为灵活,除非您打算将其限制为长度为2的ID。

+0

将此标记为答案;我很有趣,但我并不知道?:诡计。 – Paul 2011-06-06 19:40:03

+0

@保罗你的慷慨感谢。很高兴你发现它很有用。我赞成你的回应,因为它也是一个有用的策略来挑选特定的群体。 – 2011-06-06 19:44:32

+0

你是对的,模式必须匹配以compar为前缀的页面 - 比如compario.asp,comparioCust.apsx等 – roland 2011-06-06 19:48:14

2

为什么摆脱他们就拿第二场比赛组,否则你可以使用一个名为匹配组像这样:

\/selector/(?<pageName>compar.+|produ.+).aspx\?famiid=(?<familyId>\d{2})\&produ=\d{2} 

比赛组返回可按名称等基团[“FAMILYID”]

+0

Actualy我只需要一个匹配组以满足一般原因。 – roland 2011-06-06 19:34:13

+0

我明白你只需要一个;我的观点是,你不会因为有多个而只使用你需要的那个而伤害任何东西。 – Paul 2011-06-06 19:35:30

+0

谢谢你们的帮助。通过询问一个问题,我学到了两种不同的东西:p – roland 2011-06-06 19:37:25