【问题标题】:Find Exact match in a string- C#在字符串中查找完全匹配 - C#
【发布时间】:2020-08-03 18:12:11
【问题描述】:

如何在字符串中搜索完全匹配?例如,如果我有一个包含此文本的字符串:

string ClientName = "Sunny Mrs Cool";
string[] stringArray = { "Mr", "Ms", "Dr", "Mrs" };
    
foreach (string x in stringArray)
{                               
   if (ClientName.Contains(x))
   {}
}

我想搜索“Mrs”,我只想得到完全匹配,而不是另一个。我尝试了 Contains 和 IndexOf 方法,但它们也给了我“先生”。 有些字符串有 Ms 或 Dr 或 Mr.

【问题讨论】:

  • 您好,欢迎来到 SO!您可以拆分您的单词然后比较...您是否在 SO 上搜索过类似的问题和答案?肯定有不止一种方法可以做到这一点。
  • 我不是正则表达式向导,但是当字符串包含列表中的一个单词并且您可以通过捕获组找到它时,\b(?i)(mr|ms|dr|mrs)\b 之类的东西应该会给您一个匹配项。您还可以通过var regex = $"\b(?i)({string.Join('|',searchTerms)})\b"; 动态构建正则表达式

标签: c#


【解决方案1】:

无需增加头痛/正则表达式,您就可以非常轻松地使用 Linq:

string ClientName = "Sunny Mrs Cool";
    
string[] stringArray = { "Mr", "Ms", "Dr", "Mrs" };
    
var results = ClientName.Split(' ').ToList().Where(x => stringArray.Contains(x));
    
Console.WriteLine(results.Single());  // result is "Mrs"

然后你可以根据结果来做逻辑:

if (results.Any())
{
    process(results.first());
}
else
{
   //no valid result!
}

或者如果枚举数组并找到匹配项很重要。上面带有循环的代码也可以工作:

var result = results.First();
foreach(var x in stringArray)
{
   if (x == result)
   {
       Console.WriteLine($"{ClientName} contains: {result}");
       // Writes "Sunny Mrs Cool contains: Mrs"
   }
}

【讨论】:

  • OP要匹配,不看是否存在/包含在一个单词中...
  • @Çöđěxěŕ 是的,我觉得发布的代码有点 XY 问题。如果他有比赛,那么如果这就是他想要的,这就是有效的:if (x == clientName.Abbreviation) 基本上。虽然添加一个更字面的 == 也可能有助于回答这个问题......
【解决方案2】:

您可以为此使用正则表达式。您的正则表达式模式可能是:

\b(Mr|Ms|Dr|Mrs)\b
  • \b 表示 单词边界
  • | 表示 OR

因此,此正则表达式将匹配单词边界上的 MrMsDrMrs


编辑:

您的代码的问题是MrMrs 的子集。因此,任何包含Mrs 的字符串也将包含Mr。因为你先搜索Mr,所以你总会在Mrs之前找到它。

在单词边界上搜索可以轻松解决这个问题。


这是使用 Regex 执行此任务的 C# 代码:

string clientName = "Sunny Mrs Cool";
string[] stringArray = { "Mr", "Ms", "Dr", "Mrs" };
string pattern = $"\\b({string.Join("|", stringArray)})\\b"; // or simply just "\b(Mr|Ms|Dr|Mrs)\b"
Console.WriteLine(Regex.Match(clientName, pattern).Groups[1].Value); // prints "Mrs"

【讨论】:

  • 如何将其应用于 OP 代码?还有为什么要用Regex,用户在用吗? OP首先做错了什么?您在回答恕我直言时错过了这些重要问题。
  • @Youssef13 谢谢,您如何应用您的建议以及为什么使用Regex
猜你喜欢
  • 1970-01-01
  • 2016-02-12
  • 1970-01-01
  • 2015-09-02
  • 1970-01-01
  • 1970-01-01
  • 2013-05-21
  • 1970-01-01
  • 2020-09-04
相关资源
最近更新 更多