我使用简单的正则表达式来匹配包含以:
开头的单词的字符串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
答案 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
}