在 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 返回完全匹配。似乎没有。您知道返回完全匹配的好方法吗? @user3394486Contains
返回精确匹配
如果Connecticue
应该为Connecticut
返回true,那么Conecticu
和Konnecticut
呢?您的匹配规则完全不清楚
【参考方案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) [关闭]