Nolonar 的解决方案 没有考虑行以所需单词开头或结尾的可能性。
此外,您需要记住,^
锚点$
匹配整个字符串的开始/结束,除非您传递RegexOptions.Multiline
使它们匹配行边界的选项。
因此,提取包含整个单词的所有行的正确正则表达式解决方案是
var finder = new Regex($@"^.*?(?<!\w){Regex.Escape(wordToFind)}(?!\w).*", RegexOptions.IgnoreCase | RegexOptions.Multiline);
// Or, in order to avoid getting CR at the end of the extracted lines
// var finder = new Regex($@"^.*?(?<!\w){Regex.Escape(wordToFind)}(?!\w)[^\r\n]*", RegexOptions.IgnoreCase | RegexOptions.Multiline);
var results = finder.Matches(multilineString).Cast<Match>().Select(x => x.Value); // Use x.Value.Trim() to trim the result
请注意,您可以通过使用内联修饰符RegexOptions.IgnoreCase | RegexOptions.Multiline
将代码合并到模式本身中来稍微“缩小”代码,:(?im)
var finder = new Regex($@"(?im)^.*?(?<!\w){Regex.Escape(wordToFind)}(?!\w).*");
var finder = new Regex($@"(?im)^.*?(?<!\w){Regex.Escape(wordToFind)}(?!\w)[^\r\n]*");
^^^^^
查看正则表达式演示
图案细节
^
- 一行的开始
.*?
- 除换行符之外的任何 0+ 字符,尽可能少(*?
是一个惰性的、非贪婪的量词)
(?<!\w)
- 左侧单词边界
{Regex.Escape(wordToFind)}
wordToFind
-字符串的转义版本
(?!\w)
- 右手边的单词边界
.*
- 除换行符之外的任何 0+ 字符,尽可能多(*
是一个贪婪的量词)。注意:匹配.NET 正则表达式.
中的回车符, 因此我对提取值的建议。或改为匹配 CR 和 LF 以外的 0 个或多个字符。\r
.Trim()
[^\r\n]*