2015-12-02 2 views
0

У меня возникли трудности с попыткой получить мой простой оператор Regex в C#, работающий так, как я этого хочу.Условные границы слова Regex, фиксирующие неправильные слова

Если у меня есть длинная строка, и я хочу, чтобы найти слово «исполнительный», но НЕ «руководители» Я думал, что мое регулярное выражение будет выглядеть примерно так:

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

Это, однако, по-прежнему совпадение на входах, которые содержат только executives, а не executive (единственное число).

Я думал, что границы слов в регулярном выражении, если они используются в начале и конце вашего регулярного текста, будут указывать, что вы только хотите совместить это слово, а не любую другую форму этого слова?

Edit: Для того, чтобы выяснить, Что происходит, я пытаюсь найти все Notes среди 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, даже если я не хочу, чтобы он, следующий код будет не (иначе это не то, что я ожидал, что это делать):

foreach (var stu in Students) 
{ 
    foreach (var note in stu.Notes) 
    { 

     if (Regex.IsMatch(note.NoteText, string.Format(@"\b{0}\b", query))) 
      Console.WriteLine(stu.LastName); 
    } 
} 

Почему цикл вложенного цикла с тем же кодом регулярного выражения создает точные совпадения, в то время как выражение linq, кажется, хочет вернуть что-либо, содержащее слово, которое я ищу?

+0

@PranavCBalan да, я прочитал это, и их пример из \ b4 \ b фактически совпадает с тем, что у меня есть, только их пример НЕ соответствует «44», тогда как мой (исполнительный против руководителей) – user2357446

+0

Какой тип шаблон возвращается для руководителей? Я не могу заставить это произойти с учетом вашего кода. – teynon

+0

@Tom Я отредактировал мое сообщение для уточнения – user2357446

ответ

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(); 

Однако, не ясно, какой результат вы хотите получить, если же студент будет иметь примечания, содержащие как исполнительной и руководителей ,

+0

Извините за мой плохой английский. –

Смежные вопросы