【问题标题】:How to completely check, if a string is equal to a contained word in a string in c#?如何完全检查字符串是否等于c#中字符串中包含的单词?
【发布时间】:2017-12-10 22:31:50
【问题描述】:

也许这个问题有点混乱。 我将以更好的方式解释这一点 看这段代码

string myfirststring = "hello1,hello123,content";
string_2 = "ent";
if (myfirststring.Contains(string_2)){
    Console.WriteLine("Yes! this is included in the 1 string");
    //then check if string_2 is equal to the 3 element of 1 string: content
}

现在我想检查我包含的字符串“string_2”是否完全等于 myfirststring 的第 3 个元素:内容(在这种情况下,不是因为值是 ent 而不是 content 所以 ent != content) 那么我该如何检查呢?

【问题讨论】:

  • 您的myfirststring 是否总是由, 分隔?
  • 不,这是我真实项目中的一个例子,我有一个混淆的字符串,例如:--hello123--|-hello12--|-content-|---=
  • 所以你的字符串是由带有任意数量连字符的管道符号分隔的?

标签: c# string search


【解决方案1】:

如果单词以逗号分隔,您可以执行以下操作:

var exactlyContained = myFirstString.Split(',').Any(w => w == string_2);

如果找到完全匹配,这将返回true,在任何其他情况下返回false

更新

根据评论,您的字符串似乎包含由不同符号序列分隔的单词。也许您可以使用这种自定义拆分方法(您可以根据您的特定需求对其进行调整,我没有太多信息可供参考):

public static IEnumerable<string> CustomSplit(this string s)
{
    var buffer = new StringBuilder();

    foreach (var c in s)
    {
        if (!char.IsLetterOrDigit(c))
        {
            if (buffer.Length > 0)
            {
                yield return buffer.ToString();
                buffer.Clear();
            }
        }
        else
        {
            buffer.Append(c);
        }
    }

    if (buffer.Length > 0)
        yield return buffer.ToString();
}

现在代码是:

var exactlyContained = myFirstString.CustomSplit().Any(w => w == string_2);

【讨论】:

  • 如果我不知道用什么符号分隔单词?如何自动检查字符串中的符号?
  • @Programmer 没有直接的方法可以做到这一点。您需要对字符串进行一些启发式分析,以尝试找出分隔符可能是什么(重复的非字母字符等),但它不会 100% 安全。
  • @Programmer 看到我的答案的更新,也许它会有一些用处。
【解决方案2】:

因此,由于您的字符串没有指定的分隔符并且按照您的示例字符串,我将减少所有非字母数字字符并重新创建您的 myFirstString

string myFirstString = "hello1,hello123,content";
string yourSecondString = "ent";

首先我定义了一个分隔符,我需要在最后进行分割。

char delimiter = '#';

现在我创建一个新的StringBuilder 来有效地添加找到的字符并将我想要检查的字符设置为非字母数字字符。

var firstStringBuilder = new StringBuilder();
char previousChar = delimiter;

准备就绪后,我遍历字符串中的所有字符并将所有字符添加到StringBuilder,并将所有非字母数字字符减少为单词之间的单个分隔符。

foreach (char singleChar in myFirstString)
{
    if (Char.IsLetterOrDigit(singleChar))
    {
        firstStringBuilder.Append(singleChar);
        previousChar = singleChar;
    }
    else if(Char.IsLetterOrDigit(previousChar))
    {
        firstStringBuilder.Append(delimiter);
        previousChar = singleChar;
    }
}

完成循环后,我将检查是否有任何单词匹配 yourSecondString

bool matched = firstStringBuilder.ToString()
                                 .Split(delimiter)
                                 .Any(str => string.Equals(str, yourSecondString));

【讨论】:

    【解决方案3】:

    我知道出于性能原因它通常不被接受,但如果您总是处理单个单词(而不是句子等),则正则表达式使查找变得相对简单。

    // regex "\b" indicates a word boundary, so surrounding your lookup string with them ensures your expression matches the entire word 
    if (Regex.IsMatch(myfirststring, $"\b{string_2}\b")){
        Console.WriteLine("Yes! this is included in the 1 string");
        //then check if string_2 is equal to the 3 element of 1 string: content
    }
    

    编辑:在if 语句中添加了缺少的右括号

    【讨论】:

      猜你喜欢
      • 2014-01-25
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      • 2012-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多