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

时间:2014-08-22 23:48:19

标签: c# regex

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

开头的单词的字符串
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,然后它永远不会匹配。

或者,如果用户searchFor是:

$ 

它会一直为记录返回true。

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

由于

**UPDATED**

让我试着解释一下。我们的想法是寻找以某些词开头的名字:

string searchFor = "Gha";

和recipient.User.FullName列表包含:

Jordan Ghassari
James Cunningham
Ghabriel Bercholee 

比赛必须是:

Jordan Ghassari 
Ghabriel Bercholee 

还必须考虑全名列表可以包含特殊字符。它需要在搜索中包含特殊字符

搜索o^bri 并获得:

O^Brian

搜索#34 并获得:

Depto #345

2 个答案:

答案 0 :(得分:1)

我不确定你的完整问题,但你需要使用Regex escaper来表示这样的条件。 $是一个特殊字符。实际搜索美元符号将是\$。你应该查找其他特殊字符并注意它们,尽管C#regex escaper会做的。

编辑喜欢这样:

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

This is a tested and working solution. 您只需转义用户输入的模式部分,然后使用该模式创建新的Regex对象。 \b不能用于匹配特殊字符,因此我们使用了一些C#lookbehinds,如here所示。然后循环遍历每个字符串并将匹配存储在某种数据结构中,我选择了一个通用列表。

答案 1 :(得分:0)

如果没有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
}