我有一个需要匹配的项目名称列表,项目列表可能看起来像这样:
suzu
suzu-domestic
suzu-international
suzuran
suzuran-international
scorpion
scorpion-default
yada
yada-yada
etc
如果搜索的项目是suzu
,我希望从列表中得到以下结果:
suzu
suzu-domestic
suzu-international
但不包含任何内容suzuran
。如果项目搜寻是suzuran
suzuran
suzuran-international
但不包含任何内容suzu
。
在C#代码中,我有类似以下内容:
String searchForProject = "suzu";
String regStr = @"THE_REGEX_GOES_HERE"; // The regStr will be in a config file
List<Project> projects = DataWrapper.GetAllProjects();
Regex regEx = new Regex(String.Format(regStr, searchForProject));
result = new List<Project>();
foreach (Project proj in projects)
{
if (regEx.IsMatch(proj.ProjectName))
{
result.Add(proj);
}
}
问题是,我是否可以使用正则表达式使我能够在所有确切的项目名称上进行匹配,但不能通过startWith等价项返回的名称进行匹配?(今天我有个regStr = @"^({0})#"
,但这不能满足上述情况,因为它带来的点击数超出了预期)
如果有人可以向我提示正确的方向,我将不胜感激。谢谢 !马格努斯
您所需要的实际上是
var regStr = @"^{0}\b";
该^
锚断言在字符串的开始位置。该\b
模式匹配单词和非单词字符之间的位置,即字符串的开头或结尾。.*
由于您正在使用Regex.IsMatch
,因此不需要将其余字符串与匹配,这是多余的开销。
C#测试代码:
var projects = new List<string>() { "suzu", "suzu-domestic", "suzu-international", "suzuran", "suzuran-international", "scorpion", "scorpion-default", "yada", "yada-yada" };
var searchForProject = "suzu";
var regStr = @"^{0}\b"; // The regStr will be in a config file
var regEx = new Regex(String.Format(regStr, searchForProject));
var result = new List<string>();
foreach (var proj in projects)
{
if (regEx.IsMatch(proj))
{
result.Add(proj);
}
}
所述foreach
可以用更短的LINQ代替:
var result = projects.Where(s => regEx.IsMatch(s)).ToList();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句