2012-03-29 100 views
2

我似乎无法找到这个问题的一个很好的解决方案。我收到了一些我收到的关于丢失或被盗设备的报告中提供的字符串数据。我一直在使用string.IndexOf函数完成其余的表单,并且工作得很好。这个问题与该领域说,如果该设备丢失或被盗。C# - 搜索字符串

例子:

“?丢失或被盗迷失”

“?丢失或被盗被盗”

我需要能够读取该但是当我做string.IndexOf(@"Lost")它将永远回归失败,因为它是在问题中。

不幸的是我无法改变的形式本身以任何方式,并且由于它是如何submited我不能只写代码的撞击前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"; 
} 
+2

正则表达式? – 2012-03-29 19:34:25

+2

总是有一个问号?由此分割。 – Andre 2012-03-29 19:35:49

+0

'我一直在使用string.IndexOf函数通过表单的其余部分,它工作得很好'我们在这里讨论什么样的表单? – 2012-03-29 21:35:46

回答

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

你可以查找字符串“迷失”,如果出现两次,那么你可以确认是'迷失'。

+0

不错的做法:) – oleksii 2012-03-29 19:39:56

2

如果我理解你的要求,你正在寻找的LostStolen实例的?后:

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; 
0

它在这种情况下,你可以在一个子知道,这是使用的指数可能总是会说先丢失或被盗

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

类似:

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

它是否适合你的使用情况,它可能会使用.EndsWith()容易。

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