匹配每个以另一个单词开头的单词(包括特殊字符)的正则表达式



我使用一个简单的正则表达式来匹配包含以:

开头的单词的字符串
string regExp = @"b" + searchFor; // searchFor is input value to look for
matchName = Regex.IsMatch(recipient.User.FullName, regExp, RegexOptions.IgnoreCase);

对于单词来说效果很好(当然),但是如果FullName包含如下内容:

This is Ex$ample

并且用户尝试查找Ex$a,然后它永远不匹配。

或者如果user searchFor是:

$ 

对于记录,它始终返回true。

我试着看其他帖子,但我找不到类似的东西。

感谢
**UPDATED**

让我来解释一下。其思想是查找以某些单词开头的名称:

string searchFor = "Gha";

和recipient.User.FullName列表包含:

Jordan Ghassari
James Cunningham
Ghabriel Bercholee 

匹配必须是:

Jordan Ghassari 
Ghabriel Bercholee 

还需要考虑fullname列表可以包含特殊字符。它需要在搜索

中包含特殊字符

搜索o^bri并获得:

O^Brian

搜索#34并获得:

Depto #345

我不确定您的完整问题,但是您需要使用Regex转义器来处理这样的条件。$是一个特殊字符。实际搜索美元符号是$。您也应该查找其他特殊字符并注意它们,尽管c# regex转义器会做标记。

编辑如下:

string[] names = 
{
    "Jordan Ghassari",
    "James Cunningham",
    "Ghabriel Bercholee",
    "O^Brian",
    "Depto #345",
    "This is Ex$ample",
    "$amuel"
};
string searchFor = Console.ReadLine(); // Input
searchFor = @"(?:(?<=^|s)(?=S|$)|(?<=^|S)(?=s|$))" + Regex.Escape(searchFor); // searchFor is input value to look for
Regex regEx = new Regex(searchFor, RegexOptions.IgnoreCase);
List<string> matchedNames = new List<string>();
foreach(string name in names){
    if (regEx.IsMatch(name))
    {
        matchedNames.Add(name);
    }
}
foreach (string match in matchedNames) 
{
    Console.WriteLine(match);
}

这是一个经过测试和工作的解决方案。您只需转义用户输入的模式部分,然后使用该模式创建一个新的Regex对象。b不能用于匹配特殊字符,所以我们使用了一些c#的后台代码,如下所示。然后循环遍历每个字符串并将匹配项存储在某种数据结构中,我选择了通用列表

不使用RegEx可能会更简单:

string searchString = "This is Ex$ample";
string searchFor = "Ex$a";
searchString = " " + searchString;
searchFor = " " + searchFor;
if (searchString.IndexOf(searchFor) >= 0)
{
    // Match
} else {
    // No Match
}

如果你想要一个不区分大小写的搜索,用这个代替:

if (searchString.IndexOf(searchFor, StringComparison.OrdinalIgnoreCase) >= 0)
{
    // Match
} else {
    // No Match
}

最新更新