c#备选文本

本文关键字:文本 | 更新日期: 2023-09-27 17:58:27

我想获得familyId,compar/produ.aspx之间有一个替代方案。我使用正则表达式:

''/选择器/(compar.+|produ.+).aspx ''?familyid=(''d{2})''''amp;produ=''d{2}

匹配:/selector/comparioPage.aspx?familyid=32&produ=40和/选择器/productCust.aspx?familyid=32&produ=40

并且我得到familyId作为第二个匹配。

事实上,我不得不使用()来使替代方案(compar或produ)成为可能。问题是我不想在匹配组中获得compario或product。

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

我怎样才能摆脱(),只得到家庭ID?

感谢

c#备选文本

您可以使用以下语法指定非捕获组:(?:...)

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

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

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

通过使用[^.]+,它将匹配除句点之外的所有内容。此外,为什么要将数字限制在两位?如果有一个或多个呢?'d+更灵活,除非您打算将其限制为长度为2的ID。

为什么要去掉它们?只需选择第二个匹配组,否则您可以使用一个命名的匹配组,如下所示:

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

返回的匹配组可以通过类似组的名称["familyId"]访问