我有一个简短的问题,我希望有人可以为我提供一些启示。
RegEx还是新手,所以这种行为对我没有意义。我正在使用C#编写一个简单的函数,该函数搜索给定字符串中的子字符串列表以及字符串中的子字符串位置。我的代码如下所示:
DataTable matchtable = new DataTable();
string searchstring = " Take a left in 2.1 miles. Then take a right in 3 miles";
var substringlist = new [] {"2.1 miles", "3 miles", "4.1 miles", "1","take"};
string searchregexstr = string.(@"(\W|^){0}(\W|$)", string.Join("|", substringlist));
Regex searchregex = new Regex(searchregexstr);
if (searchregex.IsMatch(searchstring))
{
foreach (Match substring in searchregex.Matches(searchstring))
{
string substringmatch = substring.toString();
int indexofsubstringmatch = searchstring.IndexOf(substringmatch);
matchtable.Rows.Add(susbtringmatch, indexofsubstringmatch);
}
return matchtable;
}
return matchtable;
我的主正则表达式匹配函数如下所示:
string searchregexstr = string.(@"(\W|^){0}(\W|$)", string.Join("|", substringlist));
我的问题是:
在查看我的比赛表结果时,我得到了2.1英里和1英里的命中(在2.1内匹配)
我假设(我认为不正确)我的正则表达式只寻找完全匹配,其中1不应该匹配,因为它本身在字符串中找不到。
有什么东西突然缺失了吗?
非常感谢您提前提供的所有帮助!
锌加
答案 0 :(得分:0)
嗯,你可以通过多种方式做到这一点。例如以下代码将返回在特定字符串中找到的术语索引列表。
public static IEnumerable<int> GetStringIndices(IEnumerable<string> substringlist, string data)
{
var lstIndices = new List<int>();
foreach (var searchString in substringlist)
{
var regexObj = new Regex($@"(?<=(\s|^)){searchString}(?=(\s|$)|(\W)+?)",
RegexOptions.IgnoreCase | RegexOptions.Multiline);
var matchResults = regexObj.Match(data);
if (!matchResults.Success)
{
lstIndices.Add(-1);
continue;
}
while (matchResults.Success)
{
var idx = matchResults.Index;
lstIndices.Add(idx);
matchResults = matchResults.NextMatch();
}
}
return lstIndices;
}
如果我通过上面提到的搜索字符串和术语
var data = "Take a left in 2.1 miles. Then take a right in 3 miles";
var substringlist = new[] { "2.1 miles", "3 miles", "4.1 miles", "1", "take" };
var indices = GetStringIndices(substringlist, data);
您将获得名为indices的变量中的索引列表。最终结果将是
[15,48,-1,17,0,32]
在指数15处找到2.1英里
3.1在索引48处,依此类推。
答案 1 :(得分:0)
您的代码有一些错误,例如,string.(
,toString
,susbtringmatch
以及向没有列的DataTable
添加行时出现运行时错误。顺便说一下,你真的需要DataTable
吗?
更正了拼写错误并删除了DataTable
后,如果您按照以下方式更正此行,您的代码就可以正常使用:
string searchregexstr = string.Format(@"(\W|^){0}(\W|$)", string.Join("|", substringlist));
比赛是:
2.1 miles (with leading space)
take (with trailing space)
3 miles
最后,您不需要第一个return
,因为最后一个就足够了。
如果您需要帮助调整正则表达式,我强烈推荐RegExr。