C# - 搜索字符串

时间:2012-03-29 19:32:56

标签: c# string search full-text-search

我似乎找不到解决这个问题的好方法。我收到了一系列字符串,这些字符串是从我收到的关于丢失或被盗设备的报告中输入的。我一直在使用string.IndexOf函数通过表单的其余部分,它运行得很好。此问题与该字段有关,表明设备是丢失还是被盗。

示例:

  

“丢失或被盗?丢失”

     

“丢失或被盗?被盗”

我需要能够阅读此内容,但当我string.IndexOf(@"Lost")时,它总是会丢失,因为它存在于问题中。

不幸的是,我无法以任何方式更改表单本身,并且由于其提交方式的性质,我不能只编写代码将字符串中的前15个字符敲掉,因为这可能太少了在某些情况下。

我真的很喜欢C#中的某些东西,它允许我在找到第一个结果后继续搜索字符串,这样逻辑就像:

 string my_string = "Lost or Stolen? Stolen";

 searchFor(@"Stolen" in my_string)
 {
      Found Stolen;
      Does it have "or " infront of it? yes;
      ignore and keep searching;
      Found Stolen again;
      return "Equipment stolen";
 }

5 个答案:

答案 0 :(得分:3)

这里有几个选择。您可以查找空格的最后一个索引并获取字符串的其余部分:

string input = "Lost or Stolen? Stolen";
int lastSpaceIndex = input.LastIndexOf(' ');
string result = input.Substring(lastSpaceIndex + 1);
Console.WriteLine(result);

或者你可以分开它并接受最后一句话:

string input = "Lost or Stolen? Lost";
string result = input.Split(' ').Last();
Console.WriteLine(result);

正则表达式也是一种选择,但考虑到上述更简单的解决方案,它可能会出现问题。适合这种情况的一个很好的快捷方式是使用RegexOptions.RightToLeft选项从右边开始获取第一个匹配项:

string result = Regex.Match(input, @"\w+", RegexOptions.RightToLeft).Value;

答案 1 :(得分:2)

如果我了解您的要求,那么您需要在Lost后找到Stolen?的实例:

var q = myString.IndexOf("?");
var lost = q >= 0 && myString.IndexOf("Lost", q) > 0;
var stolen = q >= 0 && myString.IndexOf("Stolen", q) > 0;

// or
var lost = myString.LastIndexOf("Lost") > myString.IndexOf("?");
var stolen = myString.LastIndexOf("Stolen") > myString.IndexOf("?");

// don't forget
var neither = !lost && !stolen;

答案 2 :(得分:1)

您可以查找字符串'Lost',如果它出现两次,那么您可以确认它是'Lost'。

答案 3 :(得分:0)

在这种情况下你可以使用索引在子串上知道它总是会说丢失或被盗第一次

所以你解析丢失或被盗,然后为你的关键字匹配剩余的字符串。

类似的东西:

int questionIndex = inputValue.indexOf("?");
string toMatch = inputValue.Substring(questionIndex);
if(toMatch == "Lost")

答案 4 :(得分:0)

如果它适用于您的用例,则可能更容易使用.EndsWith()

bool lost = my_string.EndsWith("Lost");