2014-12-19 2 views
-2

키워드의 목록이 약 30-40이고이 모든 단어를 매우 긴 텍스트로 찾으려면 몇 가지에 대해 알아 보겠습니다. 수천 단어. 아이디어 만 있습니다. 여러 개의 정규 표현식을 사용하고 List<string>에 일치 항목을 추가하십시오. 더 좋은 해결책이 있습니까?긴 문자열에서 많은 수의 단어를 검색하십시오.

P. 이 핵심 단어는 텍스트 전체에서 하나씩 혼동 될 수 있습니다.
P.P.S. 예를 들어 위키 백과의 텍스트입니다.

단어 "셰익스피어", "영어", "언어"를 찾아야합니다.

윌리엄 셰익스피어 (/ ʃeɪkspɪər/[1] 1564년 4월 26일() 세례 - 1616 4월 23일를) [1 NB] 널리에서 가장 위대한 작가로 간주 영국의 시인, 극작가, 배우,했다 영어와 세계의 저명한 극작가. [2] 그는 종종 영국의 국가 시인이자 "Bard of Avon"이라고 불린다. [3] [b 2] 그의 공동 작업을 포함하여 그의 작품은 약 38 곡, 소니 154 편, 긴 내러티브시 2 곡, 몇몇 다른 구절들, 몇몇의 저자는 불확실하다. 그의 연극은 모든 주요 언어로 번역되어 다른 극작가보다 더 자주 공연됩니다. [4] 셰익스피어는 태어 났으며 Stratford-upon-Avon에서 자랐습니다. 18 세의 나이에 Anne Hathaway와 결혼했으며 수산나와 쌍둥이 인 Hamnet과 Judith가 세 자녀를두고 있습니다. 1585 년에서 1592 년까지 그는 런던의 Chamberlain 's Men이라는 남자의 배우, 작가 및 부분 소유주로서 성공적인 경력을 쌓기 시작했으며 나중에 King 's Men으로 알려져 있습니다. 그는 49 세의 나이로 1613 년경에 스트랫 포드로 은퇴 한 것으로 보이며 3 년 후 사망했다. 셰익스피어의 사생활에 관한 기록은 거의 남아 있지 않으며, 그의 육체적 인 외모, 성적 취향, 종교적 신념 및 그를 기인 한 저작물이 다른 사람들에 의해 쓰여 졌는지에 대한 상당한 추측이있었습니다. 셰익스피어는 1589 년과 1613 년 사이에 그의 대부분의 작품을 창작했다. [6] [nb 4] 그의 초기 연극은 주로 코미디와 역사였으며이 작품은이 장르에서 제작 된 최고의 작품으로 여겨져왔다. 그 후 그는 주로 Hamlet, Lear Lear, Othello, Macbeth 등 1608 년경까지 비극적 인 글을 썼다. 마지막 단계에서 그는 로맨스라고도 불리는 비극을 쓰고 다른 극작가와 협력했습니다. 당신이 문자열에 포함 된 키워드 목록을 원하는 경우

+0

예는 더 좋을 것이다. –

+1

결과가 어떻게 보이길 원하나요? 발견 된 단어가있는 단어? 아니면 그냥 예/아니오? – Jonesopolis

+0

제목을 편집했습니다. "[제목에"태그 "가 포함되어 있어야합니까?] (http://meta.stackexchange.com/questions/19190/)"합의가 "아니오, 그렇지 않아야한다"는 것을 참조하십시오. –

답변

4

,이 같은 작동합니다 :

이 가
var results = myKeywordList.Where(k => myBigLongString.Contains(k)); 

또한 수를 Count를 대신 부울 결과를, Any를 사용하거나 수 Where

결과는 fiddle입니다.

당신이 긴 문자열에 대소 문자를 구분 사용 ToLower을 확인하려면

k

+0

나는 k가 키워드의 배열인지 이해함에 따라? 일치하는 각 단어를 목록 에 어떻게 추가 할 수 있습니까? –

+0

k는 목록의 각 키워드입니다. 그러면 각 키워드에 대해 문자열을 검색합니다. – paqogomez

+0

@ andrey.shedko'results'는 텍스트에있는 모든 키워드입니다. – paqogomez

1

아래처럼 긍정적이고 부정적인 lookaround의 주장을 사용할 수 있습니다.

@"(?<!\S)(?:Shakespeare|English|Language)(?!\S)" 

대소 문자를 구분하지 않고 일치 시키려면 (?i) 수정자를 추가하십시오.

@"(?i)(?<!\S)(?:Shakespeare|English|Language)(?!\S)" 

DEMO

P.S. 이 핵심 단어는 텍스트 전체에서 하나씩 혼동 될 수 있습니다.

@"(?i)(?<=^|[,\s])(?:Shakespeare|English|Language)(?=[,\s]|$)" 
+1

감사합니다. 이것은 아마도 트릭을 할 것이지만 나는 LINQ 방식을 선호한다. –

1

당신은 당신에게로 Substring 방법을 사용할 수 있도록합니다 시작 위치를 줄 것 같이 IndexOf를 사용

MSDN

Perls Example

int pos = mytext.IndexOf("Shakespear"); 

if(pos >= 0){ /*Shakespear found*/ } else {/*Shakespear not found*/} 

같이 IndexOf

을 찾고 문자열을 추출하고 필요에 따라 조작합니다.

1

이스케이프 된 단어 목록을 사용하여 부분 표현식을 구성 할 수 있습니다.

(의사 코드)와 같은

string rx_list = "(" + RregEscape(MyArray.join("|")) + ")";

그런 다음, 도트 인터넷은 표현 예/아니오 조건문을 할 수 없다.
해당 정보를 사용하여 'rx_list'하위 표현식을
으로 바운드 리 중재 표현식으로 바꿀 수 있습니다.

string regex_final = @"(?(?=\w)\b|\B)" + rx_list + @"(?(?<=\w)\b|\B)";

예 정규식 문자열 결과 :

# (?(?=\w)\b|\B)(Shakespeare|English|Language)(?(?<=\w)\b|\B) 

(?(?= \w)   # Conditional, is next letter a word 
     \b     # yes, word boundry 
    | \B     # no, not word boundry 
) 
(     # (1 start) 
     Shakespeare 
    | English 
    | Language 
)     # (1 end) 
(?(?<= \w)   # Conditional, was prev letter a word 
     \b     # yes, word boundry 
    | \B     # no, not word boundry 
) 
+0

그런 대답을 주셔서 감사합니다. –

+0

@ andrey.shedko - 문제 없습니다. 지금까지 이것이 가장 빠른 방법입니다. – sln

관련 문제