在括号之间的管道之后匹配值的正则表达式

时间:2016-04-14 23:07:12

标签: c# .net regex

我还在学习正则表达式,所以请原谅任何天真。

我一直在用这个网站测试: http://www.systemtextregularexpressions.com/regex.match

基本上,我在写一个正则表达式时遇到问题,这个正则表达式将在括号之间的管道之后的任何值上匹配。

给出一个示例字符串:

"<div> \n [dont1.dont2|match1|match2] |dont3 [dont4] dont5. \n </div>"

预期输出将是一个集合:

match1,
match2 

迄今为止我能够获得的最接近的是:

(?!\[.*(\|)\])(?:\|)([\w-_.,:']*)

上面给出了值,包括管道和dont3

我也试过这个人:

\|(.*(?=\]))

但输出:

|match1|match2

3 个答案:

答案 0 :(得分:1)

这是实现目标的一种方式:

(?<=\[[^\]]*\|)[^\]|]*

这里是模式的含义:

  • (?<=\[[^\]]*\|) - Lookbehind表达式,以确保任何匹配必须以开括号开头,后跟任意数量的非闭括号字符,后跟管道符
    • (?<= ... ) - 声明一个外观表达式。匹配lookbehind的东西必须紧跟在文本之前才能匹配。但是,由lookbehind匹配的部分不包括在结果匹配中。
    • \[ - 匹配一个开括号字符
    • [^\]]* - 匹配任意数量的非近似括号字符
    • \| - 匹配竖线字符
  • [^\]|]* - 匹配任意数量的既不是近括号也不是竖线字符的字符。

lookbehind是贪婪的,因此它允许在open括号和匹配文本之间有任意数量的管道。

答案 1 :(得分:0)

try this

\[.*?(?:\|(?<mydata>.*?))+\]

注意:在线工具只会向您显示给定匹配的quanted()内的最后一次捕获,但.NET会记住每次匹配多次的组

答案 2 :(得分:0)

试试这个:

^<div>\s*[^|]+|([^|]+)|([^|]+)