1

我有一些多行文本,我想找到包含特定单词的行。

在当前的实现中,我只得到这个词,但我想得到整行。这是代码:

var finder = new Regex(@"(^|\W)" + Regex.Escape(wordToFind) + @"(\W|$)", RegexOptions.IgnoreCase);
 foreach (var match in finder.Matches(multilineString))
 {
      //match should be the whole line
 }

例子:

If Request.QueryString("bar") <> "" Then
    Set bar= foo("baz")
Else
    Set bar= foo("baz2")
End If

如果我寻找foo我应该得到:

Set bar= foo("baz")
Set bar= foo("baz2")

我没有实现正则表达式,我对正则表达式也不是很熟悉,如果有人能给我一些提示以继续调查,我将不胜感激。

谢谢

4

3 回答 3

1

您可以尝试使用此正则表达式:

Regex regex = new Regex(@"^.*?\W" + Regex.Escape(wordToFind) + @"\W.*?$");

^匹配字符串或行的开头,结尾的$匹配字符串或行的结尾。
匹配所有内容.*?(但尽可能少),并且\W(大写“W”)匹配任何非单词字符(既不是字母也不是数字的字符)。

或者,如果您希望单词仅由空格分隔,则可以使用\s(小写“s”)代替。\W

这是 Regex 的一个很好的参考

于 2013-08-22T17:08:22.607 回答
0

你可以这样做

string[] lines = multilinestring.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
List<string> validString = new List<string>();
foreach(string s in lines)
{
   if(finder.Match(s).Success)
   {
      validString.Add(s);
   }
}

试试这个,应该可以

List<string> lines = multilinestring.Split(new string[] { Environment.NewLine }, StringSplitOptions.None).ToList();
List<string> validString =  lines.Where(x => finder.IsMatch(x)).ToList();
于 2013-08-22T14:28:23.983 回答
0

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]*
于 2020-03-02T11:46:18.730 回答