请帮我写一个正则表达式来提取*之间的整个内容 请注意*字符的数量可能会有所不同。
我尝试(\*\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
*******
答案 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 .*
- 其余字符串