【发布时间】:2015-12-02 05:12:19
【问题描述】:
试图让我在 C# 中的简单 Regex 语句按我想要的方式工作时遇到了一些困难。
如果我有一个长字符串并且我想找到“执行”这个词但 NOT“执行”我认为我的正则表达式看起来像这样:
Regex.IsMatch(input, string.Format(@"\b{0}\b", "executive");
但是,这仍然匹配仅包含 executives 而不是 executive(单数)的输入。
我认为正则表达式中的单词边界在正则表达式文本的开头和结尾使用时,会指定您仅想要匹配该单词而不是该单词的任何其他形式? p>
编辑:为了澄清发生了什么,我试图在Students 中找到所有包含executive 的Notes,并忽略仅包含“执行”的单词。如下:
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);
}
}
为什么具有相同正则表达式代码的嵌套 for 循环会产生准确的匹配,而 linq 表达式似乎想要返回包含我正在搜索的单词的任何内容?
【问题讨论】:
-
@PranavCBalan 是的,我已经读过了,他们的 \b4\b 示例实际上与我所拥有的相同,只是他们的示例与“44”不匹配,而我的则匹配(执行与高管)
-
高管们正在回归什么样的模式?鉴于您的代码,我无法让它发生。
-
@Tom 我已经编辑了我的帖子以便澄清
-
我仍然怀疑其他一些与正则表达式无关的问题。我会在
var studentMatches出现正则表达式的行上放置一个断点,然后查看 query 的值是什么。 -
@Tom 查询如“执行”?或者你指的是NoteText?因为它是一个控制台应用程序,我每次都手动输入“executive”作为搜索查询。是否可以在我的输入帮助中调用 Trim()?