正则表达式边界捕获错误的单词

时间:2015-12-02 05:12:20

标签: c# regex

我在尝试按照我希望的方式在C#中使用简单的Regex语句时遇到了一些困难。

如果我有一个很长的字符串,我想找到“执行”这个词,但“管理员”,我认为我的正则表达式看起来像这样:

Regex.IsMatch(input, string.Format(@"\b{0}\b", "executive");

但是,这仍然匹配仅包含executives而非executive(单数)的输入。

我认为正则表达式中的单词边界在正则表达式文本的开头和结尾使用时会指定想要匹配该单词而不是该单词的任何其他形式?

编辑:为了澄清发生了什么,我试图找到包含单词Notes的{​​{1}}中的所有Students,并忽略仅包含“执行”的单词。如下:

executive

在这种情况下,var studentMatches = Students.SelectMany(o => o.Notes) .Where(c => Regex.Match(c.NoteText, string.Format(@"\b{0}\b", query)).Success).ToList(); 将是“执行”。

奇怪的是虽然上面的代码在query上匹配,即使我不想要它,但以下代码(也就是说我做了我期待它做):

executives

为什么具有相同正则表达式代码的嵌套for循环会产生准确的匹配,而linq表达式似乎想要返回包含我要搜索的单词的任何内容?

1 个答案:

答案 0 :(得分:1)

您的linq查询会生成正确的结果。你所看到的就是你所写的。

让我们给出明确的名称

var noteMatches = Students.SelectMany(student => student.Notes)
    .Where(note => Regex.Match(note.NoteText, string.Format(@"\b{0}\b", query)).Success)
    .ToList();

在执行SelectMany后的这个查询中,我们收到了所有笔记的扁平列表。因此丢失了关于哪个学生属于哪个学生的信息。

同时,在带有foreach循环的示例代码中,您输出有关该学生的信息。

我可以假设您需要类似以下的查询

var studentMatches = Students.Where(student => student.Notes
        .Any(note => Regex.IsMatch(note.NoteText, string.Format(@"\b{0}\b", query))))
    .ToList();

但是,如果同一个学生的笔记中包含执行高管,则不清楚您想获得什么结果。