C#如何避免在.Split()中拆分名称?

C#如何避免在.Split()中拆分名称?,c#,regex,loops,foreach,split,C#,Regex,Loops,Foreach,Split,因此,基本上我有一个循环,其中processedSentencesList中的每个句子都会被迭代并扫描,以查找列表entityString中存在的单词。在每个句子中找到的每个entityString都被添加到var valid_words中 但是实体“哈利波特”和“福特汽车”并没有因为“句子.拆分()”语句而被添加 如何修改此代码,使带有空格的现有实体不会被分隔为两个单词 List <string> entityString = new List<string>(

因此,基本上我有一个循环,其中processedSentencesList中的每个句子都会被迭代并扫描,以查找列表entityString中存在的单词。在每个句子中找到的每个entityString都被添加到var valid_words中

但是实体“哈利波特”和“福特汽车”并没有因为“句子.拆分()”语句而被添加

如何修改此代码,使带有空格的现有实体不会被分隔为两个单词

    List <string> entityString = new List<string>();
        entityString.Add("Harry Potter"); //A name which i do not want to split
        entityString.Add("Ford Car"); //A name which i do not want to split
        entityString.Add("Broom");
        entityString.Add("Ronald");
        
        List <string> processedSentencesList = new List<string>();
        processedSentencesList.Add("Harry Potter is a wizard");
        processedSentencesList.Add("Ronald had a Broom and a Ford Car");
        
        
        foreach (string sentence in processedSentencesList)
          {
        
                var words = sentence.Split(" ".ToCharArray()); 
                   //But it splits the names as well
                var valid_words = words.Where(w => 
                   entityStrings.Any(en_li => en_li.Equals(w)));
                    //And therefore my names do not get added to the valid_words list
          }
List entityString=new List();
entityString.Add(“哈利波特”)//我不想拆分的名称
entityString.Add(“福特汽车”)//我不想拆分的名称
entityString.Add(“扫帚”);
entityString.Add(“Ronald”);
List PROCESSED语句列表=新列表();
processedSentencesList.Add(“哈利波特是个巫师”);
处理句子列表。添加(“罗纳德有一把扫帚和一辆福特汽车”);
foreach(processedSentencesList中的字符串语句)
{
var words=句子.Split(“.ToCharArray());
//但它也会把名字分开
var valid_words=单词。其中(w=>
entityStrings.Any(en_li=>en_li.Equals(w));
//因此,我的名字不会被添加到有效的单词列表中
}
打印时,我现在得到的输出:

扫帚

罗纳德

我期望的输出:

哈利波特

福特汽车

扫帚

罗纳德


基本上,中间有空格(2个或更多单词)的实体是分开的,因此无法与现有实体匹配。如何修复此问题?

您可以尝试匹配而不是拆分

[A-Z]\S+(?:\s+[A-Z]\S+)?

用以下方法更改您的
foreach

List<String> valid_words = new List<String>();

foreach (string sentence in processedSentencesList)
{
    valid_words.AddRange(entityString.Where(en_li => sentence.Contains(en_li)));
}

valid_words = valid_words.Distinct().ToList();
列出有效单词=新列表();
foreach(processedSentencesList中的字符串语句)
{
有效的words.AddRange(entityString.Where(en_li=>句子.Contains(en_li));
}
valid_words=valid_words.Distinct().ToList();

您可以循环浏览每个项目并使用“String.Contains()”方法,这将防止您拆分搜索字符串

例如:

List<string> valid_words = new List<string>();

foreach (string sentence in processedSentencesList)
{
  foreach (string entity in entityString)
  {
    if (sentence.Contains(entity))
    {
      valid_words.Add(entity);
    }
  }
}
列出有效单词=新列表();
foreach(processedSentencesList中的字符串语句)
{
foreach(entityString中的字符串实体)
{
if(句子包含(实体))
{
有效单词。添加(实体);
}
}
}

你能在不拆分的情况下搜索你的句子吗?很好+1.不过,很高兴看到它在OP的问题中起作用。我看到Xaruth的答案更具说服力和使用性。不同的是,使用他的循环可能比使用两个foreach循环更快。