2011-06-06 106 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