2012-03-29 79 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");