2014-06-13 30 views
3

我有一個特殊的表情符號的字符串:串,String.IndexOf返回-1

string test = "<textarea style='display:none;'>˃̣̣̥᷄⌓˂̣̣̥᷅ abcde"; 

而且我想這個字符串的一個子象下面這樣:

string sub = test.Substring(test.IndexOf(">")); 

(因爲第一個「>」的字符串「測試」的意思的HTML代碼的端部)

(我想要的結果是˃̣̣̥᷄⌓˂̣̣̥᷅ abcde

然而,Substring方法返回一個錯誤(「StartIndex不能小於0」),這意味着字符串'test'中沒有'>'。

所以我測試了類似下面:

test.Contains(">"); 

它返回 '真'。

這裏是我的問題:Contains法說,字符串「測試」包含「>」在裏面,但Substring方法不能正常工作......

我怎樣才能從右側子字符串'test'?

+0

我已刪除了地鐵標記,因爲這是更多關於字符串/子字符串的問題,不應該依賴於應用程序類型 – Sayse

+0

@TimSchmelter類似於'StartIndex不能小於0'我想。 – sloth

+0

['IndexOf(String)'](http://msdn.microsoft.com/zh-cn/library/k8b1470s.aspx)執行文化敏感搜索,而['IndexOf(Char)'](http:// msdn .microsoft.com/en-us/library/kwb0bwyd.aspx)忽略文化。 ['Contains(String)'](http://msdn.microsoft.com/en-us/library/dy85x1sa(v = vs.110).aspx)也使用序數(文化不敏感)比較。 –

回答

1

正如其他人已經說過,IndexOf(">") performans文化敏感的搜索。這意味着你必須記住,存在的字符基本上是不同的Unicode字符的組合。

讓我們來看看你的字符串的這一部分:;'>˃̣̣̥᷄⌓˂̣̣̥᷅

它包含以下Unicode字符:

SEMICOLON (U+003B) 
APOSTROPHE (U+0027) 
GREATER-THAN SIGN (U+003E) 
MODIFIER LETTER RIGHT ARROWHEAD (U+02C3) 
COMBINING DOT BELOW (U+0323) 
COMBINING DOT BELOW (U+0323) 
COMBINING RING BELOW (U+0325) 
COMBINING MACRON-ACUTE (U+1DC4) 
SEGMENT (U+2313) 
MODIFIER LETTER LEFT ARROWHEAD (U+02C2) 
COMBINING DOT BELOW (U+0323) 
COMBINING DOT BELOW (U+0323) 
COMBINING RING BELOW (U+0325) 
COMBINING GRAVE-MACRON (U+1DC5) 

注意的是,雖然它包含了GREATER-THAN SIGN (U+003E >)字符,請注意,它後面是MODIFIER LETTER RIGHT ARROWHEAD (U+02C3 ˃)字符。這個字符是所謂的spacing modifier letter,它用來改變前一個或後一個字符的含義。

這種行爲是相當類同以下字符(COMBINING DOT BELOWCOMBINING RING BELOW),這是combining diacritical marks,但這些通常被放置在頂部或字符下他們修改(你可以在這裏看到: ̣̣̥᷄⌓,這是一個SEGMENT ,由兩個DOT BELOWRING BELOWMACRON_ACUTE修改。

因此,如果您將組合字符計入(其中IndexOf(String)確實),那麼您的字符串不包含字符串>(單個大於號)。

要檢查的單個(未合併的)字符,可以使用IndexOf('>')(使用的char代替string):

此方法執行一個序(培養不敏感的)搜索,其中一個字符僅當它們的Unicode標量值相同時才被認爲與另一個字符相同。

test.IndexOf(">", StringComparison.Ordinal)


話雖這麼說,如果你要解析HTML,最好使用一個HTML解析器像Html Agility Pack

string html = "<textarea style='display:none;'>˃̣̣̥᷄⌓˂̣̣̥᷅ abcde</textarea>"; 
HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument(); 
htmlDoc.LoadHtml(html); 
var value = htmlDoc.DocumentNode.SelectSingleNode("//textarea").InnerText; 

value現在包含˃̣̣̥᷄⌓˂̣̣̥᷅ abcde

+0

謝謝您提供最詳細的解釋! 我試過你的第一個解決方案(提供一個選項) – user3555952

+0

謝謝你最詳細的解釋! 我試過你的第一個解決方案(提供一個選項),但結果不是我想要的。因爲它變成這樣 (http://cfile22.uf.tistory.com/image/222F563C539D0FF72A700E) 這些字母是分開的並變得很奇怪... 我該如何解決這個問題? 非常感謝您的幫助! – user3555952

0

在你的角色測試中使用單引號。

string sub = test.Substring(test.IndexOf('>')); 

如果要使用「字符串」而不是'c'har,則需要指定一個字符串比較類型。

string test = "<textarea style='display:none;'>˃̣̣̥᷄⌓˂̣̣̥᷅ abcde"; 
string sub = test.Substring(test.IndexOf(">", StringComparison.Ordinal)); 
Console.WriteLine(test.IndexOf(">", StringComparison.Ordinal)); 
Console.WriteLine(sub); 

string.IndexOf(string s)的默認行爲是做了StringComparison.CurrentCulture文化敏感的比較。

String.IndexOf Method (String) (System) @ MSDN

+0

當然,它的工作原理,但結果不是我想要的,因爲我在上面的評論中提到。謝謝您的回答! – user3555952