用新行提取两个字符串之间的子字符串

时间:2017-09-12 18:45:36

标签: c# regex

请帮我写一个正则表达式来提取*之间的整个内容 请注意*字符的数量可能会有所不同。

我尝试(\*\n)([\s\S]*)(\n\*),但它将所有内容分组为1个块而不是2个。

预期输出

1

Thanks for contacting us    
Regards,    
XXX

2

It wAS  a pleasure talking with you
Good to see you today

测试字符串:

*******

Thanks for contacting us    
Regards,    
XXX

************

It wAS  a pleasure talking with you    
Good to see you today

*******

1 个答案:

答案 0 :(得分:1)

您可以使用

var results = Regex.Matches(s, @"(?s)\*{3,}(.*?)(?=\*{3,}|$)")
    .Cast<Match>()
    .Select(x => x.Groups[1].Value.Trim())
    .ToList();

请参阅regex demo

<强>详情

  • (?s) - RegexOptions.Singleline内联修饰符
  • \*{3,} - 3个或更多星号
  • (.*?) - 第1组:任何0+字符,尽可能少*?是一个惰性量词
  • (?=\*{3,}|$) - 与3个或更多星号或字符串结尾后跟的位置匹配的正向前瞻(需要获得重叠匹配)。

.Select(x => x.Groups[1].Value.Trim())部分抓取第1组内的值并修剪前导/尾随空格。

另一种方法是匹配*** +行,然后将所有不带有3个或更多星号的行捕获到第1组:

(?m)^\*{3,}.*((?:\r?\n(?!\*{3,}).*)*)

请参阅this regex demo(它也可以在上面的代码中使用。)

<强>详情

  • (?m) - RegexOptions.Multiline修饰符,使^$匹配行的开头/结尾
  • ^ - 行首
  • \*{3,} - 3个或更多星号
  • .* - 该行的其余部分(或使用\r?$以确保到达行的结尾)
  • ((?:\r?\n(?!\*{3,}).*)*) - 第1组:零个或多个序列
    • \r?\n(?!\*{3,}) - CRLF或LF行结尾未跟随3个或更多* s
    • .* - 其余字符串