2014-06-13 4 views
3

나는 특별한 이모티콘의 문자열이 있습니다하위 문자열이 경우 String.indexOf는 -1을 반환

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

을 그리고 아래와 같은 문자열의 하위 문자열을 얻으려면 :

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

(내가 원하는 결과는 ˃̣̣̥᷄⌓˂̣̣̥᷅ abcde입니다)

012 (첫 번째는 ">"문자열 "테스트"의 HTML 코드의 끝을 의미하기 때문에)

그러나 Substring 메서드는 오류 ("StartIndex는 0보다 작을 수 없음)를 반환합니다. 즉 'test'문자열에 '>'가 없음을 의미합니다.

그래서 나는 다음과 같은 테스트 '. 진정한'그것은 반환

test.Contains(">"); 

을 여기

내 질문은 다음 Contains 방법은 문자열 '테스트'안에 '>'이 포함되어 있지만, Substring 방법이 제대로 작동하지 않는 것을 말한다 ...

가 어떻게 올바른 문자열에서 얻을 수 있습니다 문자열 'test'?

+0

이 포함


하면 HTML을 구문 분석 할 경우, 더 나은 Html Agility Pack 같은 HTML 파서를 사용하여 있음을 의미하며, 더 많은 문자열/하위 문자열에 대한 질문이 있고 응용 프로그램 유형에 의존해서는 안됩니다. – Sayse

+0

@TimSchmelter 'StartIndex는 0보다 작을 수 없습니다'라고 생각됩니다. – sloth

+0

['IndexOf (String)'] (http://msdn.microsoft.com/en-us/library/k8b1470s.aspx)는 문화적으로 민감한 검색을 수행하지만 ['IndexOf (Char)'] (http : // msdn Microsoft.com/ko-kr/library/kwb0bwyd.aspx)에서는 문화를 무시합니다. ['Contains (String)'] (http://msdn.microsoft.com/en-us/library/dy85x1sa (v = vs.110) .aspx)는 서문 비교 (culture insensitive) 비교도 사용합니다. –

답변

1

다른 사람들이 이미 말했듯이, IndexOf(">") performans 문화에 민감한 검색 할 수 있습니다. 즉 기본적으로 다른 유니 코드 문자의 조합 인 문자가 있다는 것을 명심해야합니다. 그것은 GREATER-THAN SIGN (U+003E >) 문자를 포함하는 동안, 그것이 MODIFIER LETTER RIGHT ARROWHEAD (U+02C3 ˃) 문자 뒤에 있습니다 것을

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) 

참고 : ;'>˃̣̣̥᷄⌓˂̣̣̥᷅

그것은 다음과 같은 유니 코드 문자를 포함

의 당신의 문자열의이 부분을 살펴 보자 . 이 문자는 이전 또는 이후 문자의 의미를 변경하는 데 사용되는 spacing modifier letter이라고합니다. SEGMENT입니다 ̣̣̥᷄⌓을 : 당신이 여기에서 볼 수 있듯이 (

이 문제는 combining diacritical marks있는 다음 문자 (COMBINING DOT BELOW, COMBINING RING BELOW), 아주 비슷한, 그러나 이들은 보통 상단에 배치하거나 문자 이하가 수정 두 개로 수정 됨 DOT BELOW, RING BELOWMACRON_ACUTE.

따라서 결합 문자를 고려하면 (IndexOf(String) 포함) 문자열에 > (기호보다 큼) 문자열이 없습니다.

이 방법은 서수 (문화를 구분) 검색, 문자를 수행

당신은 (A char 대신 string (A)의 사용) IndexOf('>')를 사용하여, 하나의 (결합되지 않음) 문자를 확인하려면 유니 코드 스칼라 값이 같은 경우에만 다른 문자와 동등한 것으로 간주됩니다.

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

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

당신의 캐릭터 테스트를 둘러싼 단일 인용문을 사용하십시오.

'c'har 대신 "strings"를 사용하려면 stringComparison Type을 지정해야합니다.

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

관련 문제