2016-03-02 79 views
0

我有一个简单的问题,我希望有人能够为我阐明一些亮点。正则表达式从列表中找到完全匹配

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不应该匹配,因为我t在字符串中找不到。

是否有什么突出的缺失?

非常感谢您提前提供任何帮助!

Zinga

回答

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([email protected]"(?<=(\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); 

,你会得到一个名为指标变量指标的列表中提及。最终结果将是

[15,48,-1,17 0,32]

2.1英里在索引15

3.1被发现是在索引48等。

0

你的代码中有一些错误,例如,string.(toStringsusbtringmatch,并没有列添加行到DataTable时运行时错误。顺便说一句,你真的需要一个DataTable

string searchregexstr = string.Format(@"(\W|^){0}(\W|$)", string.Join("|", substringlist)); 

这些比赛:

2.1 miles (with leading space) 
take (with trailing space) 
3 miles 

最后,你不

已经纠正了错别字,并删除DataTable,如果你纠正这一行这样的代码工作正常,我t需要第一个return,因为最后一个就足够了。

如果您需要帮助调整正则表达式,我强烈建议RegExr