C#正则表达式:特定的单词之间捕获文本

C#正则表达式:特定的单词之间捕获文本

问题描述:

我试图用正则表达式来进行以下萃取(文本之后标签/页/):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

我对上下文仍有点困惑。您是否试图将第一个项目符号点的值重写为第二个项目符号点? –

一个正则表达式,可以帮助你是

/(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! –

为什么不使用

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重写引擎,迫使我使用正则表达式。 –