在 C# 中使用 LINQ 在字符串数组中查找确切的子字符串

Posted

技术标签:

【中文标题】在 C# 中使用 LINQ 在字符串数组中查找确切的子字符串【英文标题】:Find exact substring in string array using LINQ in C# 【发布时间】:2017-10-10 14:38:40 【问题描述】:

我正在尝试查看字符串数组中是否存在确切的子字符串。如果子字符串存在于字符串中,则返回 true,但它将包含拼写错误。

编辑: 例如,如果我正在检查字符串数组中是否存在“Connecticut”,但拼写为“Connecticute”,它仍然会返回 true,但我不希望这样。我希望它为“康涅狄格”返回 false 并为 仅限“康涅狄格”

有没有办法使用 LINQ 做到这一点?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace ConsoleApplication2

class Program

    static void Main(string[] args)
    
        string[] sample = File.ReadAllLines(@"C:\samplefile.txt");
        /* Sample file containing data organised like
        Niall      Gleeson      123 Fake Street     UNIT 63     Connecticute     00703       USA      
         */

        string[] states = File.ReadAllLines(@"C:\states.txt"); //Text file containing list of all US states
        foreach (string s in sample)
        
            if (states.Any(s.Contains))
            
                Console.WriteLine("Found State");
                Console.WriteLine(s);
                Console.ReadLine();
            
            else
            
                Console.WriteLine("Could not find State");
                Console.WriteLine(s);
                Console.ReadLine();
            
        
    

  

【问题讨论】:

您是否想知道 LINQ 是否具有执行自动拼写检查的能力?如果是这样,答案是否定的。 如果有其他拼写,您必须编写您认为是“通过”的替代拼写。这可以通过基本的字符串函数或正则表达式来完成。 @JoakimSkoog 我想知道是否有办法使用 .Contains 返回完全匹配。似乎没有。您知道返回完全匹配的好方法吗? @user3394486 Contains 返回精确匹配 如果Connecticue 应该为Connecticut 返回true,那么ConecticuKonnecticut 呢?您的匹配规则完全不清楚 【参考方案1】:

String.Contains 如果字符串的一部分在要匹配的字符串中的任何位置,则返回 true。

因此"Conneticute".Contains("Conneticut") 为真。

如果您想要完全匹配,您正在寻找的是String.Equals

...
if (states.Any(s.Equals))
...

【讨论】:

但是...他不想Conneticute匹配Conneticut...? @MikeChamberlain 和 "Conetticute".Equals("Connetticut") 不会产生 true。请注意,您的单词边界解决方案只是一个更好的主意。 是的,这个问题有点模棱两可——很难确切知道要问什么。【参考方案2】:

您可以使用\b 匹配word breaking 字符(即空格、句点、字符串的开头或结尾等):

  var r = new Regex("\bConneticut\b", RegexOptions.IgnoreCase);
  var m = r.Match("Conneticute");
  Console.WriteLine(m.Success); // false

【讨论】:

是否可以将字符串数组中的值传入var r?所以不是var r = new Regex("\bConneticut\b", RegexOptions.IgnoreCase);,而是var r = new Regex("\bStringArrayValue\b", RegexOptions.IgnoreCase);,它会遍历字符串数组中的每个项目,看看它是否存在于var m中? 你不能循环遍历你的字符串数组,对每个项目进行相同的正则表达式比较吗?【参考方案3】:

不要使用string.Contains,它匹配字符串是否包含字母序列,而是使用正则表达式匹配,无论您认为合适。例如,这将匹配单词边界,

var x = new []  "Connect", "Connecticute is a cute place", "Connecticut", "Connecticut is a nice place" ;
x.Dump();
var p = new Regex(@"\bConnecticut\b", RegexOptions.Compiled);
x.Where(s=>p.IsMatch(s)).Dump();

这将匹配“Connecticut”和“CConnecticut is a nice place”,但不匹配其他字符串。更改正则表达式以满足您的确切要求。

(linqpad中使用了.dump(),可以用来试验这种东西)

【讨论】:

以上是关于在 C# 中使用 LINQ 在字符串数组中查找确切的子字符串的主要内容,如果未能解决你的问题,请参考以下文章

C# LINQ 从字符串数组列表中选择

用于检查字符串列表/数组中的字符串的 C# 最佳实践 (LINQ) [关闭]

在c#中使用lambda或linq查找项目索引[关闭]

使用 Linq C# 在 DataTable 中查找重叠的日期

C# LINQ 在列表中查找重复项

C# LINQ 从字符串数组中选择元素