2016-03-03 85 views
1

我試圖用正則表達式來進行以下萃取(文本之後標籤/頁/):C#正則表達式:特定的單詞之間捕獲文本

  • /前綴/標籤/ abc /頁/ 15
  • /前綴/標籤/ abc
  • /前綴/頁/ 15

所以,基本上,我需要一個模式,它將從上面的字符串中爲每個字符串捕獲2個組。 結果應該是:

  • 用於第一串:$ 1 = ABC和$ 2 = 15
  • 用於第二串:$ 1 = ABC和$ 2 =空
  • 爲第三串:$ 1 =空和$ 2 = 15

/prefix/(?:tag)/([^/]+)/(?:page)/([^/]+)模式正是我所需要的,但只是第一個字符串。如果可以修改它,那將是非常好的,因此它會返回第二個和第三個字符串所需的結果。

任何幫助將不勝感激! 謝謝,

+0

也許['/(?:標籤|頁)/ (? [^ /] +)'](http://regexstorm.net/tester?p=%2f(%3f%3atag%7cpage)%2f(%3f%3cres%3e%5b%5e%2f% 5CN%5D%2b)中與I =%2fprefix%2ftag%2fabc%2fpage%2f15%0D 0A%%2fprefix%2ftag%2fabc%0D 0A%%2fprefix%2fpage%2f15)? –

+0

非常感謝你Wiktor的快速和良好的評論。 我在url重寫引擎中使用它,並且由於這個原因,我還需要包含「/ prefix /」文本的模式。 –

+0

我對上下文仍有點困惑。您是否試圖將第一個項目符號點的值重寫爲第二個項目符號點? –

回答

0

一個正則表達式,可以幫助你是

/(prefix)/(?:tag|page)/([^/]+) 

regex demo在這裏。

enter image description here

基本上,正則表達式匹配的/隨後用prefix(捕獲到組1),接着用/,然後或者tagpage隨後與另一/,然後將正則表達式引擎嘗試捕捉到第2組除/以外的一個或多個字符。

UPDATE

對於在評論中討論了這個問題請嘗試以下操作模式(demo):

(?=\S)(?:(?:/(abc))(?:/[^/]+)*?)?(?:/(\d+))?$ 

enter image description here

+0

謝謝Wiktor!是否有可能將2個結果中的2個結果作爲1美元和2美元?我也需要在模式中使用**/prefix/**。 –

+0

你的意思是你想要捕獲應該是組1的字面詞「前綴」?像['/(prefix)/(?:tag|page)/([^/]+)'](http://regexstorm.net/tester?p=%2f(prefix)%2f(%3f%3atag) %7cpage)%2F(%5B%5E%2F%5CN%5D%2b)中與I =%2fprefix%2ftag%2fabc%2fpage%2f15%0D%0A%2fprefix%2ftag%2fabc%0D%0A%2fprefix%2fpage% 2f15)? (見*表*在在regexstorm.net頁面的底部部分) –

+0

我需要將捕獲以下結果的圖案: - /前綴/標籤/ ABC /頁/ 15 $ 1 = ABC和$ 2 = 15 /前綴/(?:標記)/([^ /] +)/前綴/標記/ abc $ 1 = abc和$ 2 =空 -/prefix/page/15 $ 1 =空和$ 2 = 15 //(?:頁面)/([^ /] +)'模式完全符合我的需要,但僅適用於第一個字符串。如果可以修改它,那將是非常好的,因此它會返回第二個和第三個字符串所需的結果。再次感謝Wiktor! –

2

爲什麼不使用

var folders = myValue.Split('/'); 
var matches = folders.Skip(1) 
    .Where((f, i) => folders[i] == "tag" || folders[i] == "page"); 

更容易閱讀和可能比使用正則表達式更高效。

+0

這有點棘手 - 它做的是預期的,但我的第一印象是,它提取*'標記'和'頁'的部分...如果這個代碼在生產中,我希望它包括評論澄清它的真實含義。 –

+0

@MichaelBray是的,'for'子句可能會更具可讀性,但稍微短一些。 –

+0

非常感謝Yuriy,但我需要這個URL重寫引擎,迫使我使用正則表達式。 –

相關問題